SharePoint Online Rest API 创建列表项返回403 - Forbidden错误问题咨询
403 Forbidden错误引发原因
- 缺少SPO POST请求强制要求的
X-RequestDigest校验头:SharePoint Online所有写入类REST接口都需要携带该请求头做CSRF校验,你当前提交的headers配置中未包含该字段,是最高概率的触发原因。 - 账号权限不足:当前操作的登录账号没有目标
Departments列表的添加项权限,或无对应站点的访问权限。 - 列表项元数据类型配置错误:代码中
__metadata的type值通过变量pListName拼接生成,如果pListName和列表的实际内部名称不匹配,也会触发校验类403错误。 - 跨域请求未授权:如果你的代码部署在SharePoint站点域外,未配置SPO的跨域访问权限或未携带合法授权令牌,也会返回403。
对应解决方案
1. 补充X-RequestDigest请求头
如果你的代码是直接嵌入在SharePoint站点页面中,直接从页面内置的隐藏字段取请求摘要即可,修改后的请求代码如下:
var listURL = webURL + "/_api/web/lists/GetByTitle('Departments')/items"; $.ajax({ url: listURL, type: "POST", headers: { "accept": "application/json;odata=verbose", "content-Type": "application/json;odata=verbose", "X-RequestDigest": $("#__REQUESTDIGEST").val() // 新增请求摘要头 }, data: JSON.stringify({ '__metadata': { 'type': 'SP.Data.' + pListName + 'ListItem' }, 'Title': 'Test1' }), success: function(data) { console.log(data.d.results); alert("Item added") }, error: function(error) { alert(JSON.stringify(error)); } });
如果请求上下文不存在该隐藏字段,可以先调用GET接口webURL + "/_api/contextinfo"获取请求摘要值,再填入请求头。
2. 校验账号权限
联系站点管理员确认当前操作账号已被分配目标列表的【添加列表项】权限,最低需要列表层级的编辑权限才可新增项。
3. 修正列表实体类型值
先调用GET接口webURL + "/_api/web/lists/GetByTitle('Departments')?$select=ListItemEntityTypeFullName"查询该列表对应的正确实体类型名称,和你拼接的SP.Data.xxxListItem做比对,如果列表名称包含空格、特殊字符,内部名称会做转义处理,不能直接用列表显示名称拼接type值。
4. 跨域场景授权
如果你的代码是部署在SharePoint域外的独立应用,需要先在Azure AD中注册应用,申请SharePoint对应的读写权限,获取合法的OAuth2访问令牌后,将令牌添加到Authorization请求头中再发起请求。
内容的提问来源于stack exchange,提问作者Venkat Sunkara
相关产品推荐
相关产品推荐

