【问题标题】:Update list item through Sharepoint REST API通过 Sharepoint REST API 更新列表项
【发布时间】:2014-10-26 14:31:04
【问题描述】:

我想更新 Sharepoint 中 ListItem 的某些字段。如何通过 REST API 实现这一点?

有这方面的文档吗?

编辑 1

考虑一下我在请求 ListItem(GET) 时收到的以下 JSON

{
"d": {
    "__metadata": {
        "id": "8b3d2196-ad3e-4766-a23e-7e6a89153965",
        "uri": "https://abc-my.sharepoint.com/personal/nn_abc_co/_api/Web/Lists(guid'd02a8c5b-cd69-4aa8-b7fb-9d539733f285')/Items(383)",
        "etag": "\"2\"",
        "type": "SP.Data.DocumentsItem"
    },
    "FirstUniqueAncestorSecurableObject": {
        "__deferred": {
            "uri": ".../FirstUniqueAncestorSecurableObject"
        }
    },
    "RoleAssignments": {
        "__deferred": {
            "uri": ".../RoleAssignments"
        }
    },
    "AttachmentFiles": {
        "__deferred": {
            "uri": ".../AttachmentFiles"
        }
    },
    "ContentType": {
        "__deferred": {
            "uri": ".../ContentType"
        }
    },
    "FieldValuesAsHtml": {
        "__deferred": {
            "uri": ".../FieldValuesAsHtml"
        }
    },
    "FieldValuesAsText": {
        "__metadata": {
            "id": ".../FieldValuesAsText",
            "uri": ".../_api/Web/Lists(guid'd02a8c5b-cd69-4aa8-b7fb-9d539733f285')/Items(383)/FieldValuesAsText",
            "type": "SP.FieldStringValues"
        },
        "ContentTypeId": "0x0120000E7EB3018A9074468823208C432BDCA5",
        "Title": "",
        "IsMyDocuments": "",
        "SharedWithInternal": "",
        "SharedWithUsers": "",
        "ID": "383",
        "Created": "7/29/2014 11:28 PM",
        "Author": "3",
        "Modified": "7/29/2014 11:28 PM",
        "Editor": "3",
        "OData__x005f_CopySource": "",
        "CheckoutUser": "",
        "OData__x005f_UIVersionString": "1.0",
        "GUID": "da1e223b-1335-49e8-a544-b2cbebd4064f",
        "OData__x005f_ModerationStatus": "Approved",
        "OData__x005f_Level": "1",
        "UniqueId": "3dba6291-92c7-458f-9a28-e0a91696d9ca",
        "FSObjType": "1",
        ...
        },
    "FileSystemObjectType": 1,
    "Id": 383,
    "ContentTypeId": "0x0120000E7EB3018A9074468823208C432BDCA5",
    "Title": null,
    "IsMyDocuments": null,
    "SharedWithInternalId": null,
    "SharedWithUsersId": {
        "__metadata": {
            "type": "Collection(Edm.Int32)"
        },
        "results": [5]
       },
...   }
}

从上面的 JSON(我当然改变了,但这是一个真实的响应),我需要更改“FieldValuesAsText”对象下“SharedWithUsers”的值。

这可能吗?我一直在尝试,即使调用返回成功响应码,但并没有改变任何东西。

另一方面,如果我在第一级更改字段,我的意思是“标题”之类的字段,它会成功更改。

但是(超出我的理解)第一级中的“SharedWithUsersId”等值也不会改变。即使我也得到了相同的成功响应代码。

我正在创建的 Post 数据如下,

对于标题(就像一个魅力!我读过的每个博客都参考这个例子!)

{
  "__metadata": {
    "type": "SP.Data.DocumentsItem"
},
    "Title":"Blabla"
}

对于 FieldValuesForEdit 或 FieldValuesAsText 下的 SharedWithUsers 字段

{
"__metadata": {
    "type": "SP.Data.DocumentsItem"
},
"FieldValuesForEdit": {
    "__metadata": {
        "type": "SP.FieldStringValues"
    },
    "SharedWithUsers": ""
}
}

我已经验证 SharedWithUsers 的值为 "" 当它不包含任何数据时(我发布的示例 JSON 证实了这一点)但是使用此类数据的 POST 调用不会更新它。

对于 SharedWithUsersId

{
"__metadata": {
    "type": "SP.Data.DocumentsItem"
},
"SharedWithUsersId": {
        "__metadata": {
            "type": "Collection(Edm.Int32)"
        },
        "results": []
    }
}

请注意,在这种情况下 >>> "SharedWithUsersId":null 也不起作用,即使我自己的罪恶之眼已经看到某些项目有这样的反应! (微软万岁!!!)

对于上述所有 POST 数据 JSON 对象,我得到一个 204 响应代码(我相信这是 MERGE 调用的正确代码)

我希望我已经很好地解释了我的问题。任何或所有帮助表示赞赏!

【问题讨论】:

  • 您所说的“确定”是什么意思,能否请您更新您的问题并指定例如字段类型?
  • @VadimGremyachev 我已按问题更新。我希望我说得很清楚。
  • 看我的最终目标是通过 REST API 更新项目的共享详细信息

标签: sharepoint ms-office sharepoint-2013 office365


【解决方案1】:

阅读此 MSDN 帖子:http://msdn.microsoft.com/en-us/library/office/dn292552%28v=office.15%29.aspx#ListItems

url ==> 应该指向您要更新的列表项。

方法 ==> POST,因为你想更新一个列表项

body ==> JSON 格式,包含您要更新的字段。省略那些你不想改变的。

下面和例子:

url: http://site url/_api/web/lists/GetByTitle(‘Test')/items(item id)
method: POST
body: { '__metadata': { 'type': 'SP.Data.TestListItem' }, 'Title': 'TestUpdated'}
headers:
   Authorization: "Bearer " + accessToken
   X-RequestDigest: form digest value
   "IF-MATCH": etag or "*"
   "X-HTTP-Method":"MERGE",
   accept: "application/json;odata=verbose"
   content-type: "application/json;odata=verbose"
   content-length:length of post body

获取 accessToken 可能很困难,具体取决于您执行此调用的应用程序类型(SharePoint 应用程序、控制台应用程序、SharePoint 内部)。

【讨论】:

  • 是的!我已经经历了这个,但我的问题有点棘手。对于 Listitem,有一个名为“FieldValuesAsText”的字段,我想更新此对象的内部字段。我创建的 JSON 看起来像 >>> { "__metadata": { "type": "SP.Data.DocumentsItem" }, "FieldValuesAsText": { "__metadata": { "type": "SP.FieldStringValues" }, " SharedWithUsers": "" } } 但是我得到一个 204 说没有内容。我注意到的一件事是每次执行调用时,ETag 的值都会增加!
  • 虽然如果您想更改第一级字段值......比如......说标题等......但我正在寻找一种方法来更改内部对象的值。
  • 你试过了吗:{ "__metadata": { "type": "SP.Data.DocumentsItem" }, "Title":"Blabla", "SharedWithUsers": }
【解决方案2】:

如果您希望使用 HttpClient 执行此操作,可以参考这篇文章。我展示了如何获取 Digest 和 Upload 文件并在事后更新列表项。适用于 Windows 应用商店、控制台和表单应用。

使用 REST 从 HttpClient 更新文件的示例:

client = new HttpClient(new HttpClientHandler() { UseDefaultCredentials = true }); client.BaseAddress = new System.Uri(url); client.DefaultRequestHeaders.Clear(); client.DefaultRequestHeaders.Add("X-RequestDigest", digest); client.DefaultRequestHeaders.Add("X-HTTP-Method", "MERGE"); client.DefaultRequestHeaders.Add("IF-MATCH", "*"); HttpContent strContent = new StringContent(String.Concat("{ '__metadata': { 'type': 'SP.List' }, 'Title': '", filename, "' }")); strContent.Headers.ContentType = new MediaTypeHeaderValue("application/json"); strContent.Headers.ContentType.Parameters.Add(new NameValueHeaderValue("odata", "verbose")); HttpResponseMessage updateResponse = await client.PostAsync(String.Concat("_api/web/lists/GetByTitle('Project Photos')/Items(", id, ")"), strContent); updateResponse.EnsureSuccessStatusCode(); if (updateResponse.IsSuccessStatusCode) {}

https://arcandotnet.wordpress.com/2015/04/01/sharepoint-2013-rest-services-using-c-and-the-httpclient-for-windows-store-apps/

Arcan.NET

【讨论】:

    猜你喜欢
    • 2019-06-06
    • 2023-04-06
    • 2019-07-13
    • 1970-01-01
    • 2021-03-05
    • 1970-01-01
    • 2021-05-19
    • 2016-01-08
    • 1970-01-01
    相关资源
    最近更新 更多