2014-09-02 187 views
1

我想更新Sharepoint中ListItem的某些字段。我如何通過REST API實現這一目標?通過Sharepoint REST API更新列表項

有沒有關於此的任何文檔?

編輯1

考慮以下JSON,我收到請求列表項(GET)

{ 
"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(我已經ofcourse改變,但它是一個真正的響應) ,我需要在「FieldValuesAsText」對象下更改「SharedWithUsers」的值。

這可能嗎?我一直在嘗試,甚至是調用返回成功響應代碼,但它不會改變任何東西。

另一方面,如果我在第一級更改字段,那麼我的意思是像「標題」這樣的字段,它會成功更改。

然而(不是我的理解),像第一級中的「SharedWithUsersId」這樣的值也不會改變。儘管我也獲得了相同的成功響應代碼。

我創建POST數據如下,

對於標題(就像一個魅力!我已經閱讀每一個博客,是指這個例子!)

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

對於SharedWithUsers場FieldValuesForEdit下OR FieldValuesAsText

{ 
"__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」:空也不起作用,即使我自己罪惡的眼睛已經看到了一些項目這樣的反應! (所有冰雹微軟!!!)

對於上述所有POST數據JSON對象,我得到一個204響應代碼(我認爲這是一個MERGE調用正確的代碼)

我希望我已經解釋我的問題不夠好。任何或所有的幫助表示讚賞!

+0

你說的 「一定」 的意思,你可以請更新您的問題並指定,例如,字段類型? – 2014-09-02 13:28:41

+0

@VadimGremyachev我已更新的問題。我希望我說得很清楚。 – 2014-09-02 17:58:29

+0

看到我的最終目標是通過REST API更新項目的共享細節 – 2014-09-02 18:02:50

回答

1

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

URL ==>應指向要更新的列表項。

方法==> POST,因爲要更新一個ListItem

體==> 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)你做這個調用。

+0

是的!我經歷了這個,但是我的問題有點棘手。對於Listitem,有一個名爲「FieldValuesAsText」的字段,我想更新此對象的內部字段。 我創建JSON看起來像>>> { 「__metadata」:{ 「類型」: 「SP.Data.DocumentsItem」 }, 「FieldValuesAsText」:{ 「__metadata」:{ 「類型」:「 SP.FieldStringValues「 }, 」SharedWithUsers「:」「 } } 但是我得到一個204表示無內容。我注意到的一件事是,當我每次執行我的呼叫時,ETag的值遞增! – 2014-09-02 10:57:25

+0

儘管如此,如果你想改變一級字段的值,比如...說標題等,但我正在尋找一種方法來改變一個內部對象的值。 – 2014-09-02 11:29:55

+1

你嘗試: { 「__metadata」:{ 「類型」: 「SP.Data.DocumentsItem」 }, 「標題」: 「布拉布拉」, 「SharedWithUsers」:<一些用戶ID(整數)的用戶> } – 2014-09-03 09:03:35

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) {}

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

Arcan.NET