2013-04-11 82 views
6

我在使用SharePoint 2013提供的REST api重命名文檔庫內的文件夾時遇到問題。以下是我在下面使用的代碼。無法使用REST重命名SharePoint 2013中的文件夾

string digest = String.Empty; 
using (var response = await connector.HttpClient.PostAsync("_api/contextinfo", null, token)) 
{ 
    response.EnsureSuccessStatusCode(); 
    var obj = await response.ReadObject("d"); 
    digest = obj["GetContextWebInformation"].Value<string>("FormDigestValue"); 
} 

using (var request = new HttpRequestMessage(HttpMethod.Post, String.Format("/_api/Web/GetFolderByServerRelativeUrl('{0}')", operation.Path.FullName))) 
{ 
    request.Headers.Add("X-HTTP-Method", "MERGE"); 
    request.Headers.Add("IF-MATCH", "*"); 
    request.Headers.Add("X-RequestDigest", digest); 

    //{ '__metadata': { 'type': 'SP.Folder' }, 'Name': 'New name' } 
    dynamic obj = new JObject(); 
    obj.__metadata = new JObject(); 
    obj.__metadata.type = "SP.Folder"; 
    obj.Name = operation.DesiredName; 

    request.Content = new ODataJObjectContent(obj); 

    using (var response = await connector.HttpClient.SendAsync(request, token)) 
    { 
     response.EnsureSuccessStatusCode(); 
     await response.ReadText(); 
    } 
} 

在提琴手這裏是要求:

POST http://2013.blah.com/_api/Web/GetFolderByServerRelativeUrl('/Shared%20Documents/Test') HTTP/1.1 
X-HTTP-Method: MERGE 
IF-MATCH: * 
X-RequestDigest: 0xA7C057B3AECE805B7313909570F64B8EACD7A677014B8EBE7F75CC5A7C081F87973D94E7CC22346964ECAB1FE3C6B326DA3B67DF7A646FE6F47E9B1E686C3985,11 Apr 2013 15:13:05 -0000 
Accept: application/json; odata=verbose 
Content-Type: application/json; odata=verbose 
Host: 2013.skysync.com 
Content-Length: 50 
Expect: 100-continue 

{"__metadata":{"type":"SP.Folder"},"Name":"Test2"} 

然後響應:

HTTP/1.1 204 No Content 
Cache-Control: private, max-age=0 
Expires: Wed, 27 Mar 2013 15:13:15 GMT 
Last-Modified: Thu, 11 Apr 2013 15:13:15 GMT 
Server: Microsoft-IIS/8.0 
X-SharePointHealthScore: 0 
SPClientServiceRequestDuration: 15 
X-AspNet-Version: 4.0.30319 
SPRequestGuid: 53bd109c-43bb-2064-4a1b-82298b670ece 
request-id: 53bd109c-43bb-2064-4a1b-82298b670ece 
X-RequestDigest: 0x9CDB4F31CC5F3877C4383657C12BEC6CFF10FC28AB6A0BB2D9D38B4279187CBD1450359BDFF07F0E63FF550BFF96C46E0476FB895CDA104348AC066D86246BC6,11 Apr 2013 15:13:15 -0000 
X-FRAME-OPTIONS: SAMEORIGIN 
X-Powered-By: ASP.NET 
MicrosoftSharePointTeamServices: 15.0.0.4420 
X-Content-Type-Options: nosniff 
X-MS-InvokeApp: 1; RequireReadOnly 
Date: Thu, 11 Apr 2013 15:13:15 GMT 

一切看起來都很好,直到我回到SharePoint和測試文件夾仍然是相同的名稱。我遵循here的指導原則,我也見過其他非常相似的例子。我可以通過界面重命名它,而不會有任何問題。

在此先感謝您的幫助!

+0

將成爲權限問題。 – Jordan 2013-04-11 15:25:51

+1

@Jordan我可以刪除文件夾,但我知道這是可能的,但我認爲如果這是一個權限問題,我將無法刪除。 – TroyC 2013-04-11 15:56:11

+0

添加一條評論..我可以使用舊的SharePoint asmx服務進行重命名,這正是我現在所做的。有趣的是,使用上面的方法重命名List。 – TroyC 2013-04-29 04:40:42

回答

0

嘗試在清單文件中添加列表。這看起來像一個權限問題,當你必須「信任」一個應用程序,然後選擇你想要操作的列表。

+1

非常錯誤 - 這可能會在任何一方被調用,包括客戶端(這是我的情況)。語言可能是任何東西,你甚至可能沒有「清單」。就權限而言,作者確認他可以在這裏刪除文件夾 - 我只是不能使用這個API重命名。 – zaitsman 2013-06-10 09:04:49

0

下面的例子演示瞭如何通過SharePoint 2013 REST服務重命名文件夾

場景:Archive文件夾重命名爲位於Documents

using (var client = new SPHttpClient(webUri, userName, password)) 
{ 
    RenameFolder(client, webUri.ToString(),"Documents/Archive","2015"); 
} 

其中

private static void RenameFolder(SPHttpClient client, string webUrl,string folderUrl,string folderName) 
    { 
     var folderItemUrl = webUrl + "/_api/web/GetFolderByServerRelativeUrl('" + folderUrl + "')/ListItemAllFields"; 
     var data = client.ExecuteJson(folderItemUrl); 

     var itemPayload = new { 
      __metadata = new { type = data["d"]["__metadata"]["type"] }, 
      Title = folderName, 
      FileLeafRef = folderName, 

     }; 
     var itemUrl = data["d"]["__metadata"]["uri"]; 
     var headers = new Dictionary<string, string>(); 
     headers["IF-MATCH"] = "*"; 
     headers["X-HTTP-Method"] = "MERGE"; 
     client.ExecuteJson((string)itemUrl, HttpMethod.Post, headers, itemPayload); 
    } 
2015

注: