之前已經介紹了SP2010中支持CSOM的API進行遠程訪問SharePoint,但是CSOM的API仍然有一定的局限性,首先使用CSOM類庫是基於.Net的,因此也將使用CSOM限制在了.Net平台上(包括托管的.Net代碼,Silver Light 以及Javascript)。如何能在非.Net平台上操作SharePoint數據呢?
本文簡單介紹一下SharePoint REST api的使用方式,筆者本人也沒有用到過相關技術進行開發,難免有理解不到位的地方。歡迎大家拍磚。
讀懂此文章,建議你至少大概的知道,什么是REST api,為什么使用REST api,它的優勢在哪。本文不會展開講述講述REST相關的知識。
REST API架構
從SharePoint2013開始,REST被集成到了SharePoint中,你可以創建一個RESTful 的HttpWebRequest來訪問SharePoint數據。REST的大體架構如下:
首先,通過用OData標准,創建一個符合你想要調用的Client Object Model的API所匹配的Http請求。SharePoint服務器端在通過client.svc處理HttpRequest后,會返回相應的Atom或者JSON。
如何生成一個RESTful的HttpRequest
在SharePoint的Client Object Model,如果想要獲取一個List對象,那么你需要
Lists.GetListByTitle
那么對應的Request地址為:http://server/site/_api/lists/getbytitle('listname') 。圖片 link 完整的解釋了根據CSOM生成HttpRequest的語法。
因此如果我們需要通過REST API來獲取一個List,我們需要寫如下的代碼:
HttpWebRequest endpointRequest = (HttpWebRequest)HttpWebRequest.Create("https://cnblogtest.sharepoint.com/_api/lists/getbytitle('Documents')"); endpointRequest.Method = "GET"; endpointRequest.Accept = "application/json;odata=verbose"; endpointRequest.Headers.Add("Authorization", "Bearer " +serviceToken HttpWebResponse endpointResponse = (HttpWebResponse)endpointRequest.GetResponse();
如何解決權限的問題
關於serviceToken如何解決的問題,在msdn找了半天,目前我這邊還沒找到線程的例子,從msdn上的描述來看,OAuth 的解決方式主要用於host在provider上的app跟SharePoint 服務器間的權限認證。既然REST也是調用CSOM的另一種方式,我們就看一下CSOM是如實現權限的認證的。
下面我們運行一下SharePoint Client Object Model API 介紹以及工作原理解析 中的例子代碼,截獲一下這個代碼的請求看一下CSOM的權限認證方式:
我們一共截取到如下的請求信息:
這里面,主要關注一下最后一次查詢的報頭:
這里面我們可以看到,通信主要是通過cookie來進行權限認證的,這里面我們也可以嘗試一下用cookie來獲取。
如何獲取Cookie
實際上我們獲取cookie只需要用代碼來模擬我們截獲到的這四次請求即可,讓后替換掉里面一些諸如用戶名,密碼,Expire信息等相關的字符串。由於代碼中認證的相關邏輯都是封裝在了SharePointOnlineCredentials 這個類中,我們可以反編譯看一下封裝這個報頭的相關邏輯,我們可以直接把里面的代碼復制出來獲取cookie即可。相關類如下:
這樣getlistbytitle的調用代碼如下:
HttpWebRequest endpointRequest = (HttpWebRequest)HttpWebRequest.Create("https://cnblogtest.sharepoint.com/_api/lists/getbytitle('Documents')"); endpointRequest.Method = "GET"; endpointRequest.Accept = "application/json;odata=verbose"; endpointRequest.ContentLength = 0; var cookieContainer1 = new CookieContainer(); SharePointOnlineAuthenticationProvider provider = new SharePointOnlineAuthenticationProvider(); endpointRequest.CookieContainer = provider.GetAuthenticationCookie(new Uri("https://cnblogtest.sharepoint.com"), "test001@cnblogtest.onmicrosoft.com", pasword); HttpWebResponse endpointResponse = (HttpWebResponse)endpointRequest.GetResponse(); var stream = endpointResponse.GetResponseStream(); using (StreamReader sw = new StreamReader(stream)) { var line = sw.ReadToEnd(); }
返回的JSON格式的報文如下:
這樣返回的JSON信息,就可以通過不同的語言來進行解析了。當然,如果你使用的是JS或者其他語言,獲取cookie可能有其他方式,這里不再列舉。
此例子用到的代碼,可以以不同的編程語言的實現。SharePoint REST API,實現了基於其他語言的來訪問SharePoint的可能性,這本身是REST本身的優勢,也是SharePoint 2013帶給編程人員一個大的功能優勢。
參考文章:
http://msdn.microsoft.com/en-us/magazine/dn198245.aspx
http://msdn.microsoft.com/en-us/library/office/jj164022(v=office.15).aspx#WritingData