1. SharePoint 2013對REST編程的支持javascript
自從SharePoint2013開始, SharePoint開始了對REST 編程的支持,這樣除了.NET , Silverlight, Powershell以外, 又多了一種能夠和SharePoint Server進行CSOM編程的方式。那麼,問題來了:什麼是REST呢?什麼是ODATA?爲何這麼多產品都開始支持這個了?css
2. 什麼是REST & ODATA?java
若是這個世界上只有一家IT公司就行了,這樣就不須要REST了 :) 可是很顯然,這是不可能的。不一樣IT公司有本身提出的技術標準及解決方案。以Microsoft爲例,其實現分佈式處理的技術和解決方案發展歷程以下:COM -> DCOM -> COM+ ,跨入.NET時代,又出現了 Enterprise Component -> Web Service -> Web Service Enhancemant -> WCF ...jquery
能夠看到,僅僅一家公司,其提出的技術和解決方案就如此之多。在加上IBM, Google等等大鱷,就造成了各自爲政,羣雄混戰的局面。這樣的解決就是:在各自的系統和技術內,你們各自搞本身的。很顯然這是不符合時代發展的 :) 好比沒有任何一家公司,只用某一家IT公司的解決方案。不一樣公司的系統之間,也須要互相通信。web
那怎麼解決這個問題呢?你們握手言和吧:制定一個基於HTTP協議的標準。HTTP協議是目前爲止,最通用和成功的協議。若是某個公司說我就是不遵照HTTP協議,那他就無法轉了。 所以,只要你們遵循這個標準,系統之間均可以互相通訊。若是利用Microsoft的技術開發了一個服務,只要這個服務遵循這個標準,採用IBM技術的客戶也能夠consume這個服務,那不是很好嗎? 所以這就是REST服務出現的現實須要。ajax
言歸正傳,什麼是REST 服務呢?shell
REST的全稱是: Representational state transfer (有點繞口 :)), 她的基本思想是:能夠經過基於HTTP協議發出的不一樣 操做:Create, Read, Update, and Delete (CRUD), 來實現對數據的操做。其有三大基本特徵:編程
1) 客戶端- 服務端:api
因此數據都存儲在服務端,客戶端不知道也無需知道服務端如何處理的,只須要發送一個HTTP請求。緩存
2) 無狀態:
這個比較抽象。打個比方:
你申明一個proxy去調用服務器端的求和函數 proxy.sum(1,2) ,服務器端返回3給客戶端。 當你再次調用proxy.sum(3,4)的時候,若是是無狀態的話,其是不會記住你上次操做的結果的,也就是其會返回7;可是若是是有狀態的操做,其會記錄上一次調用的結果,並把此次結果累加再返回給客戶端,也就是3+7=10.
3)可緩存的
4)分層的
5) 統一的接口
如下是關於REST的Wiki解釋:
http://en.wikipedia.org/wiki/Representational_state_transfer
3. 如何實現一個RESTful服務
實現一個RESTful服務的方案有不少。以Microsoft的.NET解決方案爲例, WCF3.5就開始了對REST服務的支持。你能夠用WCF輕鬆建立一個 WCF REST API服務供其它客戶端consume.
有關如何經過WCF 實現一個REST服務,能夠參考下面的文檔:
https://msdn.microsoft.com/en-us/magazine/dd315413.aspx
4 如何過濾和選擇數據
如何讓服務器返回本身真正想要的數據呢? 其實ODATA提供了豐富的數據過濾和選擇操做:
1)$filter : 過濾數據
2) $select : 選擇須要的字段
3) $expand: 擴展返回的屬性
4) $orderby:排序
5) $top:返回前N條數據
5. SharePoint 2013對REST服務的支持
SharePoint 2013 實現了REST服務的支持,這樣咱們又多了一種途徑能夠訪問SharePoint了。實際上SharePoint的REST服務是一個經過叫作client.svc的WCF REST服務來實現的。其URL爲:https://sharepointserver/_vti_bin/client.svc
1) SharePoint 2013的REST服務部署的路徑以下:
https://servername/sitename/_api/....
實際上上面這個地址只是其原始服務的一個別名(alias), 畢竟打出完成的client.svc有點醜陋哦。
好比:
https://winstononline.sharepoint.com/_api/...
https://winstononline.sharepoint.com/sites/spdev/...
2) SharePoint 2013支持的命名空間:
要對SharePoint 2013發出一個REST請求,必須指明你所要訪問的namespace。支持的namespace包括:
a) _api/web
b) _api/site
c) _api/search
d) _api/publishing
例如: 我想返回一個叫作Doctest的list裏面ID爲3的item,而且只返回ID字段:
http://winstononline.sharepoint.com/_api/web/lists/Doctest/items?$filter=ID eq 3 & $select=ID
又如:
https://winstononline.sharepoint.com/_api/web/lists/Doctest/items?$select=ID & $orderby=ID
<?xml version="1.0" encoding="utf-8" ?> - <feed xml:base="https://winstononline.sharepoint.com/_api/" xmlns="http://www.w3.org/2005/Atom" xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices" xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" xmlns:georss="http://www.georss.org/georss" xmlns:gml="http://www.opengis.net/gml"> <id>b3c0e660-6937-4da9-b1cf-c1bd6613be1a</id> <title /> <updated>2015-02-04T07:22:31Z</updated> - <entry m:etag=""3""> <id>bccd25b6-c6cf-4748-a75b-aca5b6826fe8</id> <category term="SP.Data.DoctestItem" scheme="http://schemas.microsoft.com/ado/2007/08/dataservices/scheme" /> <link rel="edit" href="Web/Lists(guid'906b7bcc-bd4f-4d8c-9e46-6e01b5579d5f')/Items(1)" /> <title /> <updated>2015-02-04T07:22:31Z</updated> - <author> <name /> </author> - <content type="application/xml"> - <m:properties> <d:Id m:type="Edm.Int32">1</d:Id> <d:ID m:type="Edm.Int32">1</d:ID> </m:properties> </content> </entry> - <entry m:etag=""4""> <id>7604db11-97fa-4433-b652-51eb70b013d9</id> <category term="SP.Data.DoctestItem" scheme="http://schemas.microsoft.com/ado/2007/08/dataservices/scheme" /> <link rel="edit" href="Web/Lists(guid'906b7bcc-bd4f-4d8c-9e46-6e01b5579d5f')/Items(2)" /> <title /> <updated>2015-02-04T07:22:31Z</updated> - <author> <name /> </author> - <content type="application/xml"> - <m:properties> <d:Id m:type="Edm.Int32">2</d:Id> <d:ID m:type="Edm.Int32">2</d:ID> </m:properties> </content> </entry> - <entry m:etag=""2""> <id>ec2a5b46-ae8f-4334-8a85-9a777660021c</id> <category term="SP.Data.DoctestItem" scheme="http://schemas.microsoft.com/ado/2007/08/dataservices/scheme" /> <link rel="edit" href="Web/Lists(guid'906b7bcc-bd4f-4d8c-9e46-6e01b5579d5f')/Items(3)" /> <title /> <updated>2015-02-04T07:22:31Z</updated> - <author> <name /> </author> - <content type="application/xml"> - <m:properties> <d:Id m:type="Edm.Int32">3</d:Id> <d:ID m:type="Edm.Int32">3</d:ID> </m:properties> </content> </entry> </feed>
6. SharePoint客戶端技術對REST服務的支持
若是採用上面發送REST請求的方法來和SharePoint進行交互,能夠很容易的執行各類操做。可是惟一的肯定是無法進行批量化的操做。爲了讓客戶端採用javascript來調用SharePoint REST的時候更加友好和強大,SharePoint提供了2個javascript類庫,分別爲sp.js和sp.runtime.js, 其位於_layouts/15/###.js下。與開發者相關的,更多的是sp.js裏面的定義。這樣全部的REST操做都被封裝在sp.js裏定義的API 裏面,顯得更加友好。
下面是經過Napa建立的一個default sharePoint App, 裏面就用到了SP.js。
<%-- The following 4 lines are ASP.NET directives needed when using SharePoint components --%> <%@ Page Inherits="Microsoft.SharePoint.WebPartPages.WebPartPage, Microsoft.SharePoint, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" MasterPageFile="~masterurl/default.master" Language="C#" %> <%@ Register TagPrefix="SharePoint" Namespace="Microsoft.SharePoint.WebControls" Assembly="Microsoft.SharePoint, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %> <%@ Register TagPrefix="Utilities" Namespace="Microsoft.SharePoint.Utilities" Assembly="Microsoft.SharePoint, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %> <%@ Register TagPrefix="WebPartPages" Namespace="Microsoft.SharePoint.WebPartPages" Assembly="Microsoft.SharePoint, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %> <%-- The markup and script in the following Content element will be placed in the <head> of the page --%> <asp:Content ContentPlaceHolderID="PlaceHolderAdditionalPageHead" runat="server"> <script type="text/javascript" src="https://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.9.1.min.js"></script> <script type="text/javascript" src="/_layouts/15/sp.runtime.js"></script> <script type="text/javascript" src="/_layouts/15/sp.js"></script> <!-- Add your CSS styles to the following file --> <link rel="Stylesheet" type="text/css" href="../Content/App.css" /> <!-- Add your JavaScript to the following file --> <script type="text/javascript" src="../Scripts/App.js"></script> </asp:Content> <%-- The markup in the following Content element will be placed in the TitleArea of the page --%> <asp:Content ContentPlaceHolderID="PlaceHolderPageTitleInTitleArea" runat="server"> Page Title </asp:Content> <%-- The markup and script in the following Content element will be placed in the <body> of the page --%> <asp:Content ContentPlaceHolderID="PlaceHolderMain" runat="server"> <div> <p id="message"> <!-- The following content will be replaced with the user name when you run the app - see App.js --> initializing... </p> </div> </asp:Content> <!--app.js--> var context = SP.ClientContext.get_current(); var user = context.get_web().get_currentUser(); (function () { // This code runs when the DOM is ready and creates a context object which is // needed to use the SharePoint object model $(document).ready(function () { getUserName(); }); // This function prepares, loads, and then executes a SharePoint query to get // the current users information function getUserName() { context.load(user); context.executeQueryAsync(onGetUserNameSuccess, onGetUserNameFail); } // This function is executed if the above call is successful // It replaces the contents of the 'message' element with the user name function onGetUserNameSuccess() { $('#message').text('Hello ' + user.get_title() +"This is my first Napa app"); } // This function is executed if the above call fails function onGetUserNameFail(sender, args) { alert('Failed to get user name. Error:' + args.get_message()); } })(); function getParameterByName(name) { }
6. 調用SharePoint REST服務示例
未完待續...