SharePoint 2013的REST编程基础

时间:2022-08-26 08:35:40

1. SharePoint 2013对REST编程的支持

自从SharePoint2013开始, SharePoint开始了对REST 编程的支持,这样除了.NET , Silverlight, Powershell之外, 又多了一种可以和SharePoint Server进行CSOM编程的方式。那么,问题来了:什么是REST呢?什么是ODATA?为什么这么多产品都开始支持这个了?

2. 什么是REST & ODATA?

如果这个世界上只有一家IT公司就好了,这样就不需要REST了 :) 但是很显然,这是不可能的。不同IT公司有自己提出的技术标准及解决方案。以Microsoft为例,其实现分布式处理的技术和解决方案发展历程如下:COM -> DCOM -> COM+ ,跨入.NET时代,又出现了 Enterprise Component -> Web Service -> Web Service Enhancemant -> WCF ...

可以看到,仅仅一家公司,其提出的技术和解决方案就如此之多。在加上IBM, Google等等大鳄,就形成了各自为政,群雄混战的局面。这样的解决就是:在各自的系统和技术内,大家各自搞自己的。很显然这是不符合时代发展的 :) 比如没有任何一家公司,只用某一家IT公司的解决方案。不同公司的系统之间,也需要互相通讯。

那怎么解决这个问题呢?大家握手言和吧:制定一个基于HTTP协议的标准。HTTP协议是目前为止,最通用和成功的协议。如果某个公司说我就是不遵守HTTP协议,那他就没法转了。 因此,只要大家遵循这个标准,系统之间都可以互相通信。如果利用Microsoft的技术开发了一个服务,只要这个服务遵循这个标准,采用IBM技术的客户也可以consume这个服务,那不是很好吗? 因此这就是REST服务出现的现实需要。

言归正传,什么是REST 服务呢?

REST的全称是: Representational state transfer (有点绕口 :)), 她的基本思想是:可以通过基于HTTP协议发出的不同 操作:Create, Read, Update, and Delete (CRUD), 来实现对数据的操作。其有三大基本特征:

1) 客户端- 服务端:

所以数据都存储在服务端,客户端不知道也无需知道服务端如何处理的,只需要发送一个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服务示例

未完待续...

SharePoint 2013的REST编程基础的更多相关文章

  1. SharePoint 2013 REST 以及 OData 基础

    这篇文章会介绍: 简单的介绍REST,OData OData实现细节 OData在SharePoint 2013中的实现 为什么REST很重要 过去几年基于REST的webservice在IT企业越来 ...

  2. 在 SharePoint 2013 中针对地理位置字段创建地图视图

    在 SharePoint 2013 中针对地理位置字段创建地图视图 了解如何通过在 SharePoint 2013 列表中使用地图视图来显示位置信息.您可以通过 SharePoint 用户界面 (UI ...

  3. &lbrack;MSDN&rsqb; 使用 SharePoint 2013 中的 JavaScript 库代码完成基本操作

    MSDN:http://msdn.microsoft.com/zh-cn/library/jj163201.aspx 了解如何编写代码以在 SharePoint 2013 中使用 JavaScript ...

  4. BEGINNING SHAREPOINT&amp&semi;&num;174&semi; 2013 DEVELOPMENT 第1章节--SharePoint 2013 介绍 SharePoint 2013 平台

    BEGINNING SHAREPOINT® 2013 DEVELOPMENT 第1章节--SharePoint 2013 介绍 SharePoint 2013 平台         SharePoin ...

  5. BEGINNING SHAREPOINT&amp&semi;&num;174&semi; 2013 DEVELOPMENT 第1章节--SharePoint 2013 介绍 处理开发者需求

    BEGINNING SHAREPOINT® 2013 DEVELOPMENT 第1章节--SharePoint 2013 介绍 处理开发者需求         SharePoint本质上是一个平台.你 ...

  6. SharePoint 2013 create workflow by SharePoint Designer 2013

    这篇文章主要基于上一篇http://www.cnblogs.com/qindy/p/6242714.html的基础上,create a sample workflow by SharePoint De ...

  7. 实现一个基于 SharePoint 2013 的 Timecard 应用(上)

    在 SharePoint 2013 上面实现一个 Timecard 应用的想法来自一个真实的需求,而实现的方案在我脑海里面盘旋已经很久了,终于这几天准备安排点儿时间将它实现出来. “ We start ...

  8. SharePoint 2013 入门教程

    以下文章是自己在学习SharePoint的过程中,不断积累和总结的博文,现在总结一个目录,分享给大家.这个博客也是自己从SharePoint入门,到一个SharePoint开发的成长记录,里面记录的都 ...

  9. SharePoint 2013 托管导航 无法被开启的解决办法

    在阅读了园子中霖雨的一片博文<SharePoint 2013 托管导航及相关配置>之后,非常想尝试一下SharePoint 2013 中的这个新功能,但是我的网站集包括样式是从2010升级 ...

随机推荐

  1. IOS开发基础知识--碎片22

    1:设置有间距的表格行(UITableViewStyleGrouped) .设置section的数目,即是你有多少个cell - (NSInteger)numberOfSectionsInTableV ...

  2. tornado autoreload 模式

    在用tornado进行 网络程序编写的时候,肯定要对代码进行修修改改,如果每次都要重启server的话,会是很麻烦的事情.tornado提供了autoreload模式. 一,要开始autoreload ...

  3. 黑马程序员-C&num;学习笔记

    ---------------------- ASP.Net+Android+IOS开发..Net培训.期待与您交流! ---------------------- C#学习笔记 1..NET/.do ...

  4. Linux命令:scp命令&lpar;文件上传和下载&rpar;

    #本地下载远端文件 并且重命名(从本地机器下载远端) scp webmaster@10.10.65.103:/ROOT/logs/tomcate.log /home/dajie/mywork/newn ...

  5. Wireshark网络抓包&lpar;三&rpar;——网络协议

    一.ARP协议 ARP(Address Resolution Protocol)地址解析协议,将IP地址解析成MAC地址. IP地址在OSI模型第三层,MAC地址在OSI第二层,彼此不直接通信: 在通 ...

  6. 基于session认证 相亲小作业

    基于session认证  相亲小作业 用户登录 如果男用户登录,显示女生列表 如果女用户登录,显示男生列表 urls ===========================urls========== ...

  7. java-最大连续子数组和(最大字段和)

    1.题目要求   给定n个整数(可能为负数)组成的序列a[1],a[2],a[3],-,a[n],求该序列如a[i]+a[i+1]+-+a[j]的子段和的最大值.当所给的整数均为负数时定义子段和为0, ...

  8. springMVC源码笔记

    springMVC 设计总览 下图来源:https://www.cnblogs.com/fangjian0423/p/springMVC-directory-summary.html 下图来源:htt ...

  9. Codeforces 781C Underground Lab 构造

    原文链接https://www.cnblogs.com/zhouzhendong/p/CF781C.html 题目传送门 - CF781C 题意 给定一个 n 个点 m 条边的无向连通图,请你用 k ...

  10. chrome调试如何禁用浏览器缓存

    0.写在前面的话 遇到过很多很多次,修改了页面代码,但是程序始终没有按照设想的方向走,有时候折腾了几个小时,发现问题最后却是莫名其妙恢复的.后来进一步调试发现,自己已经修改了如js代码,但是前端在载入 ...