SharePoint Rest API插入列表项含斯堪的纳维亚字符时返回400错误
可能的原因及对应解决方案
1. 元数据类型名称错误
__metadata.type的值必须与列表的ListItemEntityTypeFullName完全一致,很多时候用户会误以为是SP.Data.列表名ListItem,但如果列表名称有特殊字符或者创建时的内部命名规则不同,实际值会有差异。
验证方法:
发送GET请求到以下端点获取正确的实体类型名称:
GET {site-url}/_api/web/lists/getbytitle('Test')?$select=ListItemEntityTypeFullName
将返回结果中的ListItemEntityTypeFullName值替换到请求负载的__metadata.type中。
2. 字段内部名称错误
FIRST_x0020_NAME是否为目标字段的真实内部名称?显示名称中的空格会被转换为_x0020_,但如果字段创建时曾修改过名称,内部名称可能和显示名称的转换结果不一致。
验证方法:
- 进入列表设置页面,点击目标字段(如"FIRST NAME")
- 查看浏览器地址栏的URL,找到
&Field=后的参数值,该值即为字段的内部名称。
3. 手动设置冗余请求头导致不匹配
你手动设置了Host和Content-Length头,这两个头axios会自动根据请求上下文生成,手动设置可能出现以下问题:
Content-Length计算错误:你基于body.length计算的长度,和axios实际序列化JSON后的字节长度不一致,导致服务器判定请求非法。Host头与实际请求的主机不匹配。
修正方法:移除这两个手动设置的头,仅保留必要的头信息。
4. 权限或令牌有效性问题
确保你的accessToken具有该列表的添加项权限,并且令牌未过期。可以通过调用其他需要相同权限的API(如获取列表项)验证令牌有效性。
修正后的Axios请求示例
const accessToken = "你的有效令牌"; const siteUrl = "https://****.sharepoint.com"; const payload = { "__metadata": { "type": "SP.Data.TestListItem" }, // 替换为实际获取的ListItemEntityTypeFullName "FIRST_x0020_NAME": "YÄSIR ALI" }; axios.post(`${siteUrl}/_api/web/lists/getbytitle('Test')/items`, payload, { headers: { Authorization: `Bearer ${accessToken}`, 'Content-Type': 'application/json;odata=verbose', Accept: 'application/json;odata=verbose' } }) .then(response => { console.log("列表项创建成功:", response.data); }) .catch(error => { // 打印详细错误信息,定位具体问题 console.error("错误详情:", error.response?.data || error.message); });
关键排查步骤
如果以上方法仍未解决问题,务必查看400错误的详细响应内容:在catch回调中打印error.response.data,SharePoint REST API会返回具体的错误描述(如"字段类型不匹配"、"元数据类型无效"等),这是快速定位问题的核心依据。
内容的提问来源于stack exchange,提问作者Yasir Ali
相关产品推荐
相关产品推荐

