我想在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(我已经改变过,但是是一个真正的回应),我需要改变" SharedWithUsers"在" FieldValuesAsText"对象
这可能吗?我一直在尝试,甚至调用返回成功响应代码,但它没有改变任何东西。
另一方面,如果我更改第一级中的字段,我指的是" Title"等字段,它会成功更改。
然而(超出我的理解)像#34; SharedWithUsersId"在第一级别也不会改变。即使我也获得相同的成功响应代码。
我正在创建的帖子数据如下,
For Title(就像魅力一样!我读过的每个博客都引用这个例子!)
{
"__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调用的正确代码)
我希望我已经很好地解释了我的问题。任何或所有帮助表示赞赏!
答案 0 :(得分:1)
阅读此MSDN帖子:http://msdn.microsoft.com/en-us/library/office/dn292552%28v=office.15%29.aspx#ListItems
url ==>应指向您要更新的列表项。
方法==> POST,因为你想更新一个listitem
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内部)。
答案 1 :(得分:0)
如果您希望使用HttpClient执行此操作,可以参考本文。我将展示如何获取摘要和上传文件并在事后更新列表项。适用于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)
{}
Arcan.NET