Sharepoint 2013 通过 REST API:尝试创建项目时禁止出现错误 403

Posted

技术标签:

【中文标题】Sharepoint 2013 通过 REST API:尝试创建项目时禁止出现错误 403【英文标题】:Sharepoint 2013 via REST API: Error 403 Forbidden when trying to create item 【发布时间】:2015-12-02 19:38:31 【问题描述】:

我正在尝试使用 Sharepoint 2013 上的其余 api 创建一个简单的列表项。 我的代码:

$.ajax(
    url: siteUrl + "/_api/web/lists/getByTitle('internal_Listname')/items",
    type: "POST",
    contentType: "application/json;odata=verbose",
    data: JSON.stringify(
         '__metadata': 
            'type': 'SP.Data.internal_ListnameListItem',
         ,
         'K1F1': k1f1Result,
    ),
    headers: 
        "accept": "application/json;odata=verbose",
        "X-RequestDigest": $("#__REQUESTDIGEST").val(),
    ,
    success: function (data) 
        console.log("done");
    ,
    error: function (err) 
        console.log(JSON.stringify(err));
    
);

尝试发送数据时,我收到 403“禁止”错误。

"error":
   "code":"-2130575251, Microsoft.SharePoint.SPException",
   "message":
        "lang":"en-US",
        "value":"The security validation for this page is invalid and might be corrupted. Please use your web browser's Back button to try your operation again."
    

我拥有此站点和列表的完全管理员权限。

【问题讨论】:

【参考方案1】:

很可能发生此错误,因为页面上的表单摘要已过期

在这种情况下,您可以通过向/_api/contextinfo 端点发出POST 请求来获取新的表单摘要值。

示例

function getFormDigest(webUrl) 
    return $.ajax(
        url: webUrl + "/_api/contextinfo",
        method: "POST",
        headers:  "Accept": "application/json; odata=verbose" 
    );



function createListItem(webUrl, listName, itemProperties) 
    return getFormDigest(webUrl).then(function (data) 

        return $.ajax(
            url: webUrl + "/_api/web/lists/getbytitle('" + listName + "')/items",
            type: "POST",
            processData: false,
            contentType: "application/json;odata=verbose",
            data: JSON.stringify(itemProperties),
            headers: 
                "Accept": "application/json;odata=verbose",
                "X-RequestDigest": data.d.GetContextWebInformation.FormDigestValue
            
        );
    );

用法

//Create a Task item
var taskProperties = 
    '__metadata':  'type': 'SP.Data.WorkflowTasksItem' ,
    'Title': 'Order approval'
;

createListItem(_spPageContextInfo.webAbsoluteUrl, 'Workflow Tasks', taskProperties)
.done(function (data) 
    console.log('Task has been created successfully');
)
.fail(function (error) 
    console.log(JSON.stringify(error));
);

【讨论】:

我必须改变一件事才能让它工作:return getFormDigest(webUrl).then(response => response.json()).then(function (data) 即使在上面的代码之后错误仍然存​​在。最终确定它与权限有关。我试图添加项目的用户具有读取权限。在设置了贡献权限后,它起作用了。总之 - 一个非常误导性的错误信息。导致浪费时间:( 如果我有一个带有人员选择器控件、日期变量、单行文本、选择字段等的 html 表单。如何使用 REST API 插入列表项 我正在使用以下调用在 SharePoint2019 上创建一个文件夹:POST http:///_api/web/folders "__metadata": "type": "SP.Folder" , "ServerRelativeUrl": "/Shared Documents/Folder" 但我收到以下错误:403 Forbidden: 此页面的安全验证无效并且可能已损坏。请使用您的网络浏览器的返回按钮再次尝试您的操作。【参考方案2】:

几天前找到了解决方案: 我忘记将请求摘要表格添加到正文中。它应该具有以下结构;

<form runat="server">
   <SharePoint:FormDigest ID="FormDigest1" runat="server"></SharePoint:FormDigest>
</form>

【讨论】:

Vadim Gremyachev 的回答很有魅力。这对我所做的只是让页面显示错误:“抱歉,出了点问题。发生了意外错误” @DevBot 我不喜欢他的回答,因为/contextinfo 请求在所有其他请求之前完成,这是性能毒药。【参考方案3】:

我对同样问题的解决方案:

<form id="form1" runat="server"> <!-- this make SP 2013 take it legit -->
<div class="style1"> <!-- dont know what, but SP need it -->
 ---your page usually a divs---
</div>
</form>

【讨论】:

以上是关于Sharepoint 2013 通过 REST API:尝试创建项目时禁止出现错误 403的主要内容,如果未能解决你的问题,请参考以下文章

Sharepoint 2013:通过 REST API 确保用户

Sharepoint 2013 通过 REST API:尝试创建项目时禁止出现错误 403

SharePoint 2013 - REST API about Content

如何通过 REST API 在另一台服务器上为 Sharepoint 2013 和 Sharepoint Online 运行的脚本中更新 SharePoint 列表?

text 更新项REST API调用SharePoint 2013

javascript 删除项REST API调用SharePoint 2013