向SharePoint列表提交项时触发400 Bad Request错误求助
我帮你排查了代码里的几个问题,这些应该是导致400 Bad Request的主要原因:
1. 变量名与拼写错误
- 你定义了
var eResidency = $('#Residency').val();,但在POST请求的data里写成了'Residency': Residency,——这里应该用变量名eResidency,而不是未定义的Residency,这会导致请求数据缺失或错误。 - 输入框的id是
moblie(少了一个字母i),虽然能拿到值,但建议统一修正为mobile,避免后续混淆;同时对应的列名Moblile_x0020_Phone也需要修正为Mobile_x0020_Phone,确保和SharePoint列表列的内部名称一致。 E-Mail这个列名不能直接用在请求里,SharePoint会把特殊字符-替换为_x002d_,所以正确的内部名称应该是E_x002d_Mail。
2. 列表实体类型名称验证
SP.Data.ndsListListItem这个类型必须和你的列表实体类型完全匹配,你可以通过访问以下URL来获取正确的类型名称:
http://stag.psa.gov.qa/en/_api/web/lists/GetByTitle('ndsList')?$select=ListItemEntityTypeFullName
如果返回的类型名称和你代码里的不一致,直接替换即可。
3. 优化AJAX请求设置
不建议使用async: false同步请求,这会阻塞浏览器主线程,默认的async: true(可以省略这个参数)更合理。另外,错误回调里用console.log(JSON.stringify(error))代替alert,能看到更详细的错误信息,方便排查。
修正后的完整代码
<script type="text/javascript"> function createListItem() { // 获取输入框值 var eName = $('#title').val(); var eDesg = $('#name').val(); var eEmail = $('#email').val(); var eMobile = $('#mobile').val(); // 修正id拼写 var eResidency = $('#Residency').val(); var eRequestDetails = $('#RequestDetails').val(); var eStatus = $('#Status').val(); $.ajax({ url: "http://stag.psa.gov.qa/en/_api/web/lists/GetByTitle('ndsList')/items", method: "POST", data: JSON.stringify({ '__metadata': { 'type': 'SP.Data.ndsListListItem' }, // 确保此类型与列表实体类型一致 'Title': eName, 'Full_x0020_Name': eDesg, 'Mobile_x0020_Phone': eMobile, // 修正列名拼写 'E_x002d_Mail': eEmail, // 使用正确的内部名称 'Residency': eResidency, // 修正变量引用 'RequestDetails': eRequestDetails, 'Status': eStatus }), headers: { "accept": "application/json;odata=verbose", "content-type": "application/json;odata=verbose", "X-RequestDigest": $("#__REQUESTDIGEST").val() }, success: function (data) { alert("Item created successfully", "success"); }, error: function (error) { console.log("错误详情:", JSON.stringify(error)); // 控制台查看详细错误 } }); } </script> <div id="insert1"> <table> <tr> <td> Title: </td> <td> <input type="text" id="title" placeholder="Title" /> </td> </tr> <tr> <td> Full Name: </td> <td> <input type="text" id="name" placeholder="Full Name" /> </td> </tr> <tr> <td> Email: </td> <td> <input type="text" id="email" placeholder="Email" /> </td> </tr> <tr> <td> Mobile Number: </td> <td> <input type="text" id="mobile" placeholder="Mobile Number" /> </td> <!-- 修正id拼写 --> </tr> <tr> <td> Residency: </td> <td> <select id="Residency"> <option selected>In Qatar</option> <option>Outside Qatar</option> </select> </td> </tr> <tr> <td> RequestDetails: </td> <td> <input type="text" id="RequestDetails" placeholder="RequestDetails" /> </td> </tr> <tr> <td> Status: </td> <td> <select id="Status"> <option selected>Not Started</option> <option>In Progress</option> <option>Pending</option> <option>Completed</option> </select> </td> </tr> <tr> <td></td> <td> <button onclick="createListItem()">Click me</button> </td> </tr> </table> </div>
关于带空格列的x0020使用问题
你的理解是对的,SharePoint会将列名称中的空格替换为_x0020_作为列的内部名称。不过要注意:
- 必须使用列的内部名称而非显示名称,即使显示名称带空格,内部名称也会是替换后的格式。
- 如果不确定列的内部名称,可以通过两种方式查看:
- 进入列表设置,点击对应列的名称,查看浏览器地址栏末尾的
Field=xxx参数,xxx就是内部名称。 - 通过REST API请求获取所有列的信息:
http://stag.psa.gov.qa/en/_api/web/lists/GetByTitle('ndsList')/fields?$select=Title,InternalName
- 进入列表设置,点击对应列的名称,查看浏览器地址栏末尾的
内容的提问来源于stack exchange,提问作者jame
相关产品推荐
相关产品推荐

