点击按钮通过REST API向SharePoint列表添加项失败排查
针对你遇到的点击按钮调用SharePoint REST API新增列表项时出现Bad Request的问题,从代码和场景出发,主要排查以下几个核心方向:
1. 列表实体类型名称错误
你代码中__metadata.type写的是SP.Data.viewsListItem,但SharePoint的实体类型名称区分大小写且与列表内部名称强绑定:
- 若列表显示名称是
Views(首字母大写),正确实体类型应为SP.Data.ViewsListItem - 不确定类型时,可通过以下GET请求获取准确值:
$.ajax({ url: _spPageContextInfo.webAbsoluteUrl + "/_api/web/lists/getByTitle('views')?$select=ListItemEntityTypeFullName", type: "GET", headers: { "Accept": "application/json;odata=verbose" }, success: function(data) { console.log(data.d.ListItemEntityTypeFullName); // 打印正确实体类型 } });
2. 请求Digest值无效
$("#__REQUESTDIGEST").val()在现代SharePoint页面中可能无法获取有效值,或页面加载后Digest已过期:
- 替代方案:直接使用
_spContextInfo.formDigestValue(兼容经典/现代页面) - 或通过接口获取最新Digest:
function getRequestDigest() { return $.ajax({ url: _spPageContextInfo.webAbsoluteUrl + "/_api/contextinfo", type: "POST", headers: { "Accept": "application/json;odata=verbose" } }); } // 调用示例: getRequestDigest().done(function(data) { var digest = data.d.GetContextWebInformation.FormDigestValue; // 使用该digest发起新增请求 });
3. 列表名称匹配问题
getByTitle('views')区分大小写,需确认列表实际名称(含大小写、空格)与代码中完全一致,比如列表真实名称是Views而非views,会直接导致请求异常。
4. 必填字段未赋值
检查views列表是否存在除Title外的其他必填字段,若有则必须在data参数中添加对应字段赋值,否则会触发Bad Request。
修正后的示例代码
以下是调整了实体类型和Digest获取逻辑的完整代码:
$(document).ready(function(){ jQuery(document).on("click", '#btnClick', function(){ CreateListItem(); }); function CreateListItem() { // 先获取有效请求Digest $.ajax({ url: _spPageContextInfo.webAbsoluteUrl + "/_api/contextinfo", type: "POST", headers: { "Accept": "application/json;odata=verbose" }, success: function(digestData) { var formDigest = digestData.d.GetContextWebInformation.FormDigestValue; // 发起新增列表项请求 $.ajax({ url: _spPageContextInfo.webAbsoluteUrl + "/_api/web/lists/getByTitle('views')/items", type: "POST", headers: { "Accept": "application/json;odata=verbose", "Content-Type": "application/json;odata=verbose", "X-RequestDigest": formDigest }, data: JSON.stringify({ __metadata: { type: "SP.Data.ViewsListItem" // 替换为实际获取的实体类型 }, Title: "New Title" // 其他必填字段在此添加 }), success: function (data) { console.log("Success"); }, error: function (xhr) { // 打印详细错误信息辅助排查 console.log(xhr.responseText); } }); } }); } });
建议在error回调中打印xhr.responseText,其中包含具体错误描述,能更快定位问题。
内容的提问来源于stack exchange,提问作者TonyT
相关产品推荐
相关产品推荐

