之前已经介绍了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 = ;
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

SharePoint 基于 REST API使用简介的更多相关文章

  1. dom4j API使用简介

    dom4j API使用简介 功能简介 dom4j是一个Java的XML API,类似于jdom,用来读写XML文件的.dom4j是一个非常非常优秀的Java XML API,具有性能优异.功能强大和极 ...

  2. RabbitMQ系列教程之七:RabbitMQ的 C# 客户端 API 的简介(转载)

    RabbitMQ系列教程之七:RabbitMQ的 C# 客户端 API 的简介 今天这篇博文是我翻译的RabbitMQ的最后一篇文章了,介绍一下RabbitMQ的C#开发的接口.好了,言归正传吧. N ...

  3. PHP imagick API中文简介

    PHP imagick API中文简介imagick 类imagick ::adaptiveblurimage 向图像中添加 adaptive 模糊滤镜imagick ::adaptiveresize ...

  4. Angular SPA基于Ocelot API网关与IdentityServer4的身份认证与授权(四)

    在上一讲中,我们已经完成了一个完整的案例,在这个案例中,我们可以通过Angular单页面应用(SPA)进行登录,然后通过后端的Ocelot API网关整合IdentityServer4完成身份认证.在 ...

  5. Atitit 游戏的通常流程 attilax 总结 基于cocos2d api

    Atitit 游戏的通常流程 attilax 总结 基于cocos2d api 加载音效1 加载页面1 添加精灵1 设置随机位置2 移动2 垃圾gc2 点击evt2 爆炸效果3 定时生成精灵3 加载音 ...

  6. [转]SQLITE3 C语言接口 API 函数简介

    SQLITE3 C语言接口 API 函数简介 说明:本说明文档属作者从接触 SQLite 开始认识的 API 函数的使用方法, 由本人翻译, 不断更新. /* 2012-05-25 */ int sq ...

  7. 你也可以玩转Skype -- 基于Skype API开发外壳程序入门

    原文:你也可以玩转Skype -- 基于Skype API开发外壳程序入门 Skype是目前这个星球上最厉害的IM+VOIP软件,Skype现在已经改变了全球2.8亿人的生活方式.你,值得拥有! :) ...

  8. 基于 Aliexpress API 的小程序 : 批量 Copy 产品到不同的店铺

    第一个基于 Aliexpress API 的小程序 : 批量 Copy 产品到不同的店铺 还没来得及用 API 重写软件, 先写个小程序来缓解一下手工压力: 批量Copy 产品到不同的店铺. 开网店 ...

  9. 全国天气预报信息数据 API 功能简介与代码调用实战视频

    此文章对开放数据接口 API 之「全国天气预报信息数据 API」进行了功能介绍.使用场景介绍以及调用方法的说明,供用户在使用数据接口时参考之用,并对实战开发进行了视频演示. 1. 产品功能 接口开放了 ...

随机推荐

  1. Modbus协议

    总体上来说,发送命令格式如下:模块号(1字节)功能码 起始地址(2字节)   数据(X字节) CRC(2位) 模块号(1字节)功能码(要读取的寄存器,读 01,设置05,Coil Status/Inp ...

  2. Keynote of Python III

    [Keynote of Python III] 1.许多大型网站是用Python开发的,例如YouTube.Instagram,还有国内的豆瓣.很多大公司,包括Google.Yahoo等,甚至NASA ...

  3. javascript 命令方式 测试例子

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  4. perl中的运算符

    字符计算的运算符

  5. 定位一组对象-checkbox 、radiobutton

    webdriver 可以很方便的使用find_element 方法来定位某个特定的对象,不过有时候我们却需要定位一组对象,WebElement 接口同样提供了定位一组元素的方法find_element ...

  6. Adapter(适配器)-类对象结构型模式

    1.意图 将一个类接口转换成客户希望的另外一个接口.Adapter模式使那些原本不能一起工作的类,可以一起工作. 2.别名 包装器 Wrapper. 3.动机 一个应用可能会有一些类具有不同的接口,并 ...

  7. ASP.NET ZERO 学习 JTable的ChildTable用法

    效果图: Jtable的子表用法: _$masterTable.jtable({ title: app.localize('PharmacyInventory'), openChildAsAccord ...

  8. Activity生命周期(二)

    ------siwuxie95 在项目 ActivityLifeCircle 的 MainActivity.java 中添加方法: onCreate()  onStart()  onResume()  ...

  9. shell脚本学习(一)

    Shell脚本最常用于系统管理工作,或者用于结合现有的程序以完成小型.特定的工作. Shell的特点有: 1. 简单性 2. 可移植性 3. 开发容易 [什么是shell] 简单点理解,就是系统跟计算 ...

  10. vbox进行克隆时时启动eth0时问题

    在进行虚拟机克隆时会出现mac地址冲突,在进行网卡启动时,会出现device eth0 does not seem to be present问题,解决方案如下: 问题描述: device eth0 ...