使用 rest api 更新 sharepoint 中的多项选择字段
Update multiple choice field in sharepoint using rest 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();
有什么帮助吗?
在您的示例中,有效载荷很可能是无效:
string stringData =
@"{'__metadata': { 'type':'SP.ListItem' },
'TestColumn': { '__metadata': { 'type' : 'Collection(Edm.String)', results: ['Test1']}}}";
重点是类型 SP.ListItem
对应于 Generic
列表,在您的示例中它是一个 Documents 库。
因此,需要提供有效 实体类型名称,您可以利用以下端点来确定metadata type
:
端点:
Url: /_api/lists/getbytitle('<list title>')?$select=ListItemEntityTypeFullName
Method: GET
其次,更新操作需要在请求中指定以下属性:
- 使用
POST
动词创建 HTTP 请求。
- 添加值为 MERGE 的
X-HTTP-Method
header。
- 添加一个
If-Match
header,其值为实体的原始 ETag。
您可以参考 this post 了解更多详情。
最后但同样重要的是,Content-Type
和 Accept
请求 header 需要指定(请按照 this article 了解更多详细信息),例如:
request.Accept = "application/json;odata=verbose";
request.ContentType = "application/json;odata=verbose";
以下示例对其进行总结并演示如何更新multi-choice字段值:
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();
我正在尝试使用 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();
有什么帮助吗?
在您的示例中,有效载荷很可能是无效:
string stringData =
@"{'__metadata': { 'type':'SP.ListItem' },
'TestColumn': { '__metadata': { 'type' : 'Collection(Edm.String)', results: ['Test1']}}}";
重点是类型 SP.ListItem
对应于 Generic
列表,在您的示例中它是一个 Documents 库。
因此,需要提供有效 实体类型名称,您可以利用以下端点来确定metadata type
:
端点:
Url: /_api/lists/getbytitle('<list title>')?$select=ListItemEntityTypeFullName
Method: GET
其次,更新操作需要在请求中指定以下属性:
- 使用
POST
动词创建 HTTP 请求。 - 添加值为 MERGE 的
X-HTTP-Method
header。 - 添加一个
If-Match
header,其值为实体的原始 ETag。
您可以参考 this post 了解更多详情。
最后但同样重要的是,Content-Type
和 Accept
请求 header 需要指定(请按照 this article 了解更多详细信息),例如:
request.Accept = "application/json;odata=verbose";
request.ContentType = "application/json;odata=verbose";
以下示例对其进行总结并演示如何更新multi-choice字段值:
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();