使用rest api更新sharepoint中的多项选择字段

Jac*_*ago 2 c# sharepoint sharepoint-api

我正在尝试使用rest api在线更新sharepoint中的多项选择字段。我收到 401 错误请求错误。

HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create("XXXXX/_api/web/getfilebyserverrelativeurl('/sites/Sample/TestDoc.docx')/ListItemAllFields/");

string stringData = 
@"{'__metadata': { 'type':'SP.ListItem' }, 
'TestColumn': { '__metadata': { 'type' : 'Collection(Edm.String)', results: ['Test1']}}}";

request.ContentLength = stringData.Length;

StreamWriter writer = new StreamWriter(request.GetRequestStream());
writer.Write(stringData);
writer.Flush();

 response = (HttpWebResponse)request.GetResponse();
Run Code Online (Sandbox Code Playgroud)

有什么帮助吗?

Vad*_*hev 5

在您的示例中,有效负载很可能无效

string stringData = 
@"{'__metadata': { 'type':'SP.ListItem' }, 
'TestColumn': { '__metadata': { 'type' : 'Collection(Edm.String)', results: ['Test1']}}}";
Run Code Online (Sandbox Code Playgroud)

关键是类型SP.ListItem对应于Generic列表,在您的示例中它是一个文档库。

因此,需要提供有效的 实体类型名称,您可以利用以下端点来确定metadata type

端点:

Url: /_api/lists/getbytitle('<list title>')?$select=ListItemEntityTypeFullName
Method: GET
Run Code Online (Sandbox Code Playgroud)

其次,更新操作需要在请求中指定以下属性:

  • 使用POST动词创建 HTTP 请求。
  • 添加X-HTTP-Method值为 MERGE的标头。
  • 添加具有If-Match实体原始 ETag 值的标头。

你可以参考这篇文章了解更多细节。

最后但并非最不重要,Content-TypeAccept被指定的请求头的需求(遵循本文的更多详细信息),例如:

request.Accept = "application/json;odata=verbose";
request.ContentType = "application/json;odata=verbose";
Run Code Online (Sandbox Code Playgroud)

以下示例对其进行了总结并演示了如何更新多选字段值:

var requestUrl = $"{webUrl}/_api/web/getfilebyserverrelativeurl('{fileUrl}')/ListItemAllFields";
var request = (HttpWebRequest)WebRequest.Create(requestUrl);
request.Credentials = GetCredentials(userName, password);
request.Accept = "application/json;odata=verbose";
request.ContentType = "application/json;odata=verbose";
request.Method = "POST";
request.Headers.Add("X-FORMS_BASED_AUTH_ACCEPTED", "f");
request.Headers.Add("X-RequestDigest", formDigestVal);
request.Headers.Add("X-HTTP-Method", "MERGE");
request.Headers.Add("If-Match", "*");


var payload = @"{
                        '__metadata': { 'type':'SP.Data.Shared_x0020_DocumentsItem' },
                        '<ColumnName>': { '__metadata': { 'type' : 'Collection(Edm.String)'}, results: ['Val1']}
        }";

request.ContentLength = payload.Length;
var writer = new StreamWriter(request.GetRequestStream());
writer.Write(payload);
writer.Close();

var response = (HttpWebResponse)request.GetResponse();
Run Code Online (Sandbox Code Playgroud)