You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

向SharePoint列表提交项时触发400 Bad Request错误求助

SharePoint REST API 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_作为列的内部名称。不过要注意:

  • 必须使用列的内部名称而非显示名称,即使显示名称带空格,内部名称也会是替换后的格式。
  • 如果不确定列的内部名称,可以通过两种方式查看:
    1. 进入列表设置,点击对应列的名称,查看浏览器地址栏末尾的Field=xxx参数,xxx就是内部名称。
    2. 通过REST API请求获取所有列的信息:
      http://stag.psa.gov.qa/en/_api/web/lists/GetByTitle('ndsList')/fields?$select=Title,InternalName
      

内容的提问来源于stack exchange,提问作者jame

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 07:54:46