SharePoint 2013
了解和使用 SharePoint 2013 REST 接口
SharePoint 2013 提供了一个具象状态传输 (REST) 接口,从而向标准 Web 技术和语言开放了 SharePoint 2013 开发平台。 一直以来,Web 应用程序都可通过客户端对象模型使用 SharePoint 的功能,但这些 API 只对 .NET 应用程序和语言可用。 SharePoint 2013 中覆盖范围广泛的 REST 接口使得标准 Web 语言(JavaScript 或 PHP)及支持 REST 的其他任意技术堆栈或语言都可访问 SharePoint 的大多数功能和实体。
REST 接口不需要引用客户端程序集,因而可减小 Web 应用程序的代码尺寸——这对于移动应用程序来说尤为重要。 对于针对非 Microsoft 平台(如 iOS 和 Android 设备)编写的移动应用程序来说,REST 具有明显的优势,但即使对于 Windows 8 应用程序开发人员而言,它也是一项有用的资源。 使用 HTML5 和 JavaScript 编写的 Windows 8 应用程序可能需要借助 REST 接口才能实现 SharePoint 操作,而关心应用程序大小的 C# 开发人员也可能会考虑使用 REST。 本文将演示如何利用该接口将 SharePoint 平台的强大功能融入您的应用程序,以及如何借助 SharePoint 实体执行高级操作。
基本信息
远程 Web 或移动应用程序必须先获得访问授权,而后才能使用 SharePoint。 在 SharePoint 2013 中,授权访问 SharePoint 站点(无论是否使用 REST)的方法一般有两种。 第一种方法涉及到对 SharePoint 用户进行身份验证,在这种情况下,应用程序具有与用户相同的 SharePoint 数据和功能访问权限。 其他从 Web 或移动应用程序对用户执行身份验证的方法超出了本文的论述范围,但我们将简要介绍一下 SharePoint 2013 中的两个新选项,因为它们会影响构建 REST 请求的方式:
- 如果是从无法以独占方式使用客户端代码(HTML 和 JavaScript)的远程托管应用程序调用 SharePoint,且 SharePoint 与应用程序之间没有防火墙阻隔,则可使用 OAuth 2.0 令牌(使用 Microsoft 访问控制服务 (ACS) 作为安全令牌服务器)。
- 如果客户端代码和登录到 SharePoint 的用户的权限足够,则 JavaScript 跨域库 (bit.ly/12kFwSP) 将是一个很好的 OAuth 替代品。 另外,当进程调用需要穿过防火墙时,跨域库也是替代 OAuth 的一个好选择。 MSDN 库文章“SharePoint 2013 数据访问选项”(bit.ly/WGvt9L) 详细介绍了这些选项。
使用 OAuth MSDN 库文章“SharePoint 2013 中的应用程序授权和身份验证”(bit.ly/XAyv28) 详细介绍了 OAuth 在 SharePoint 2013 中的工作原理,以及如何为应用程序获取访问令牌。 得到令牌后,需要在每个 REST 请求中传递它。 为此,需要添加一个 Authorization 报头并将访问令牌作为其值进行传递(要在令牌前加上“Bearer”):
Authorization: Bearer access_token
有关执行该操作的 C# 和 JavaScript 代码示例,请参阅 MSDN 库文章“操作方法:如何使用 SharePoint 2013 REST 端点完成基本操作”(bit.ly/13fjqFn) 中的“使用 SharePoint 2013 REST 接口读取数据”一节。 该示例(检索 SharePoint 站点上的所有列表)展示了传递 OAuth 令牌的基本 REST 请求,如下所示:
HttpWebRequest endpointRequest = (HttpWebRequest)HttpWebRequest.Create( "http:// <http:///> <site url>/_api/web/lists"); endpointRequest.Method = "GET"; endpointRequest.Accept = "application/json;odata=verbose"; endpointRequest.Headers.Add("Authorization", "Bearer " + accessToken); HttpWebResponse endpointResponse = (HttpWebResponse)endpointRequest.GetResponse();
使用 JavaScript 跨域库 SharePoint 跨域库包含在 SP.RequestExecutor.js 文件(该文件位于 SharePoint 服务器上的 /_layouts/15/ 虚拟目录中)中。 要使用它,请在远程 Web 页面上加载该文件。 在 JavaScript 中,创建一个 SP.RequestExecutor 对象,然后调用其 executeAsync 方法。 需要将构建 HTTP 请求所需的信息作为该方法的参数传递给 REST 服务。 使用 OAuth 的 REST 调用与使用跨域库的 REST 调用之间的主要区别是:后者无需在请求中传递访问令牌,但必须在 REST 风格的 URL 中指定将作为客户端上下文站点的 SharePoint Web 站点。 MSDN 库文章“操作方法:使用跨域库从远程应用程序访问 SharePoint 2013 的数据”(bit.ly/12kFwSP) 更详尽地探讨了这些细节(如应用程序 Web 与主机 Web 之间的差异)。 该示例(检索 SharePoint 站点上的所有列表)展示了使用跨域库的 REST 请求,如下所示:
var executor = new SP.RequestExecutor(appweburl); executor.executeAsync( { url: appweburl + "/_api/SP.AppContextSite(@target)/web/lists?@target='" + hostweburl + "'", method: "GET", headers: { "Accept": "application/json; odata=verbose" }, success: successHandler, error: errorHandler } );
构建 REST 风格的 URL SharePoint REST 服务的实现位于 client.svc 文件(该文件位于 SharePoint Web 站点上的 /_vti_bin 虚拟文件夹中)中,但 SharePoint 2013 支持使用缩写“_api”代替“_vti_bin/client.svc”。下面是每个端点的基本 URL:
http://<domain>/<site url>/_api/
特定端点的服务相关 URL 附加在该基本 URL 之后;例如,可以使用下面的 URL 检索 SharePoint 站点上的列表:
http://<domain>/<site url>/_api/web/lists
可以通过指定 ID 的方式获取特定列表的引用,或者,如下面示例中那样指定标题:
_api/web/lists/getByTitle('samplelist')/
这些示例中的“web”并非占位符——它是 SharePoint 客户端对象模型中某个 Web 类对象的名称;“lists”是一个集合属性的名称,而“getByTitle”是该集合对象的方法。 这种范例使得 Microsoft 能够将端点与 JavaScript 对象模型的 API 引用结合起来使用;有关示例,请参阅 bit.ly/14a38wZ 和 bit.ly/WNtRMO 处的 SP.Web.lists 和 SP.ListCollection.getByTitle。 此外,这种语法也大致反映了 SharePoint 的租赁结构。 在 _api/site 处获取有关网站集的信息;在 _api/web 处获取有关 SharePoint Web 站点的信息;在 _api/web/lists 处获取有关某 Web 站点中所有列表的信息。 最后一个 URL 提供了一个包含 SharePoint 站点上所有列表的列表集合。 此外,还可以通过在开发站点集合上导航至这些 URL 来了解如何以 XML 表示这些对象。
SharePoint 内容对象模型的所有主要类都可用,包括网站集、Web 站点、列表、文件夹、字段和列表项。 可以通过 SP.User (bit.ly/15M4fzo)、SP.UserCollection (bit.ly/16TQTnW)、SP.Group (bit.ly/X55Pga) 和 SP.GroupCollection (bit.ly/ZnFHbG) 类获取有关用户的信息。 图 1 中的表格列出了用于读取操作的各个端点的示例。
图 1 用于读取操作的端点
URL | 返回结果 |
_api/web/title | 当前站点的标题 |
_api/web/lists(guid'<list id>') | 一个列表 |
_api/web/lists/getByTitle('Announcements')/fields | Announcements 列表中的列 |
_api/web/lists/getByTitle('Task')/items | Task 列表中的项目 |
_api/web/siteusers | 站点中的用户 |
_api/web/sitegroups | 站点中的用户组 |
_api/web/sitegroups(3)/users | 组 3 中的用户 |
_api/web/GetFolderByServerRelativeUrl('/Shared Documents') | Shared Documents 库的根文件夹 |
_api/web/GetFolderByServerRelativeUrl('/Plans')/Files('a.txt')/$value | Plans 库中的 a.txt 文件 |
默认情况下,以 AtomPub 格式(经过 OData 格式的扩展)的 XML 返回数据,但可通过向 HTTP 请求中添加以下可接受的报头来检索 JSON 格式的数据:
accept: application/json;odata=verbose
使用 JSON 还是 Atom (XML) 取决于您的技能范围、所使用的编程平台,以及网络延迟是否会给您的应用程序带来困扰。 相比之下,JSON 使用的字符要少得多,因此网络负载也小得多。 另一方面,大多数平台(包括 Microsoft .NET Framework)拥有丰富的 XML 解析库。
我们稍后再讨论如何使用 OData 查询运算符选择、筛选和排序数据。
写入 SharePoint 之前的所有请求都使用 HTTP 谓词 GET。 在写入 SharePoint 时,请求使用 POST 谓词——尽管在某些情况下,您可能会替代该谓词(通过向请求中添加 X-HTTP-Method 报头并指定 PUT、MERGE 或 DELETE 值)。 一般情况下,在创建站点、列表或列表项之类的对象时使用 POST。 在更新对象的特定属性且需要其他属性保持现有值不变时使用 MERGE。 在需要替换项目时使用 PUT;请求中未特别提及的属性均设为其默认值。 在需要移除项目时使用 DELETE。
写入 SharePoint 的每个请求都必须包含一个格式摘要。 您的代码可在以下端点返回的信息集中取得该摘要:
_api/contextinfo
在该请求(正文为空)中必须使用 POST 谓词并包含前面提到的 Authorization 报头。 在某些框架中,您还不得不将 POST 请求的长度指定为 0。 在返回的结构中,格式摘要包含在名为 FormDigestValue 的属性中。 在所有后续 POST 请求中,需要添加一个 X-RequestDigest 报头并以该摘要作为其值。
请注意,如果使用的是 SharePoint 托管应用程序和采用 SharePoint 默认母版页的页面,则摘要已包含在该页面上 ID 为“__REQUESTDIGEST”(含两个下划线字符)的元素中。 因此,与其调用 contextinfo 端点,不如借助脚本(如下面的 jQuery 代码)来读取该值:
var formDigestValue = $("__REQUESTDIGEST").val()
当然,需要向请求正文中添加要写入的数据,或要删除数据的标识。 使用 AtomPub/OData 或 JSON 格式均可。 如果选择后者,则必须在请求中添加一个类似下面的 content-type 报头:
content-type: application/json;odata=verbose
有关创建、读取、更新和删除 (CRUD) SharePoint 对象的具体示例,请参阅“操作方法:使用 SharePoint 2013 REST 端点的所有基本操作”(网址:bit.ly/13fjqFn)。
高级操作
SharePoint 2013 REST 接口功能强大,但有一定的复杂性。 该接口支持对其返回的数据执行排序、筛选和排列操作。 此外,它还支持大量的 SharePoint 特有操作。 较之标准的 REST 实现,这些附加能力丰富了功能,拉大了优势。 下面的章节将探讨一些您在使用 REST 和 SharePoint 时会遇到的最重要的因素。
筛选、选择和排序 可以使用 OData 系统查询选项控制返回何种数据及如何对其排序。 图 2 列出了支持的选项。
图 2 数据筛选和排序选项
选项 | 用途 |
$select | 指定在返回的数据中包含哪些字段。 |
$filter | 指定返回集合中的哪些成员(如列表中的项目)。 |
$expand | 指定返回联接列表中的哪些投射字段。 |
$top | 仅返回集合或列表的前 n 个项目。 |
$skip | 跳过集合或列表的前 n 个项目并返回其余项目。 |
$orderby | 指定用于在返回前对数据排序的字段。 |
例如,要从名为 Books 的列表中返回作者、标题和 ISBN,可以使用:
_api/web/lists/getByTitle('Books')/items?$select=Author,Title,ISBN
如果未使用 $select 选项,则返回所有字段(耗用较多服务器资源才能返回的字段除外)。 如果需要这些字段,则需使用 $select 选项并指定其名称。 要获取所有字段,可使用 $select=‘*’。
要获取马克·吐温 (Mark Twain) 的所有书籍,可使用:
_api/web/lists/getByTitle('Books')/items?$filter=Author eq 'Mark Twain'
有关 $filter 选项支持的所有运算符的列表,请参阅 bit.ly/Zlqf3e 处的 MSDN 库文章“使用 SharePoint 2013 REST 服务编程”。
要按标题升序排序书籍,可使用:
_api/web/lists/getByTitle('Books')/items?$orderby=Title asc
要指定降序,请使用“desc”代替“asc”。 要按多个字段排序,请指定一个以逗号分隔的字段列表。
可以使用“&”运算符结合多个选项。 要仅获取马克·吐温的前两部书籍的标题,可使用:
_api/web/lists/getByTitle( 'Books')/items?$select=Title&$filter=Author eq 'Mark Twain'&$top=2
该服务会待前一个选项解析完成,再开始应用下一个。 也就是说,每个选项仅应用于由 URL 中其左边的选项所产生的数据集。 因此,选项的应用顺序会产生不同的结果。 例如,下面的 URL 将返回 3-10 的项目:
_api/web/lists/getByTitle('Books')/items?$top=10&$skip=2
但颠倒这两个选项则将返回 3-12 的项目:
_api/web/lists/getByTitle('Books')/items?$skip=2&$top=10
使用降序 $orderby 和 $top 选项(按该顺序指定选项)可获取最后 n 个项目。 下面的 URL 可获取最后两个项目:
_api/web/lists/getByTitle('Books')/items?$orderby=ID desc&$top=2
当 SharePoint 列表拥有到其他列表的查找字段时,它实际上会用作两个列表的联接。 可以使用 $expand 选项返回该联接列表的投射字段。 例如,如果 Books 列表有一个查找 Publisher 列表中 Name 字段的 PublishedBy 字段,则可使用下面的 URL 返回这些名称:
_api/web/lists/getByTitle( 'Books')/items?$select=Title,PublishedBy/Name&$expand=PublishedBy
请注意,可使用语法 lookup_column_display_name/foreign_column_name 而不是 foreign_list_name/foreign_column_name 引用外部列表中的列。 还有一点很重要的是,选择查找字段名称就一定会展开它。
操作文件和文件夹 访问文档库的最佳方式是借助在 /_api/web 处可用的 GetFolderByServerRelativeUrl 方法。 向文档库中添加文件时,需要在请求正文中发送文件内容,并在 URL 中传递文件的名称:
http://<site url>/_api/web/GetFolderByServerRelativeUrl( '/Shared Documents')/Files/add(url='a.txt',overwrite=true)
更新文件时的一个重要注意事项是只能使用 PUT HTTP 方法。 因此,无法将一个文件的内容合并到已存储在文档库中的文件中。 这样做的结果是使用该文件的某个版本替换掉另一个。 另外,请务必在 URL 中使用 $value 运算符,以便访问文件本身的内容,而非与该文件关联的元数据:
http://<site url>/_api/web/GetFileByServerRelativeUrl( '/Shared Documents/a.txt')/$value
在对文件作出任意更改前将其签出是 SharePoint 中的一个最佳做法,因此,应该在更新文件前将其签出,并在完成操作后将其重新签回。 下面的操作需要向这些 URL 发送 POST 请求(请求正文为空):
http://<site url>/_api/web/GetFileByServerRelativeUrl( '/Shared Documents/a.txt')/CheckOut() http://<site url>/_api/web/GetFileByServerRelativeUrl( '/Shared Documents/a.txt')/CheckIn(comment='Comment', checkintype=0)
CheckIn 方法有两个参数。 comment 参数的作用是向签入操作添加注释,checkintype 参数则用于指定此次操作为次要 (0) 还是主要 (1) 签入。
最后需要注意的一点是,如果使用的是在浏览器客户端中运行的代码(如 JavaScript),且需要上传大小超过 1.5MB 的文件,则 REST 是您的唯一选择。 此类用于大文件(大小超过 1.5MB)的操作仅在 Internet Explorer 10(或更高版本)及其他同等优质的现代浏览器中可用。 图 3 中的示例演示了如何使用跨域库上传二进制文件。
图 3 使用跨域库上传二进制文件
function uploadFileBinary() { var executor = new SP.RequestExecutor(appweburl); var body = ""; for (var i = 0; i < 1000; i++) { var ch = i % 256; body = body + String.fromCharCode(ch); } var info = { url: "_api/web/lists/getByTitle('Shared Documents')/RootFolder/Files/Add(url='a.dat', overwrite=true)", method: "POST", binaryStringRequestBody: true, body: body, success: success, error: fail, state: "Update"}; executor.executeAsync(info); }
查询更改 到目前为止,我们已经介绍了如何通过 REST 使用 SharePoint 实体(借助模仿 SharePoint 站点结构的 URL)。 但是,这种方式无法访问或表示某些 SharePoint 类型。 在 REST 的上下文中,最重要的三个类型是 ChangeQuery、ChangeLogItemQuery 和 ChangeToken。
ChangeQuery 对象能够查询 SharePoint 更改日志,以获取对 SharePoint 网站集、站点或列表所做的任意更新。 REST 接口在以下三个位置提供 getchanges 方法:
- /_api/site(用于网站集)
- /_api/web(用于站点)
- /_api/web/lists/list(guid'<list id>') 或 /_api/web/lists/getByTitle('list title')(用于列表)
向这些位置中的任意一个传递查询的方法是:在相应的 URL 路径后添加 /getchanges,然后通过请求的 POST 正文发送 ChangeQuery 对象。 下面是一个 JSON 格式的简单的更改查询(查询已添加至某个列表的所有项目):
{ 'query': { '__metadata': { 'type': 'SP.ChangeQuery' }, 'Add': 'true', 'Item': 'true' } }
getchanges 方法要求在查询参数内包含一个请求正文(该正文包含一个 ChangeQuery 对象的表示)。 例如,向 URL 发送下面的请求以获取特定列表:
/_api/web/lists/list(guid'<list id>')/getchanges
或者
/_api/web/lists/getByTitle('<list title>')/getchanges
响应返回结果包含匹配该请求的更改集合。 如果该列表只有一个项目,则响应正文类似下面这样:
{"d": {"results":[{ "__metadata":{ "id":"https://<site url>/_api/SP.ChangeItema7e7c6e9-2c41-47c3-aae9-2b4a63b7a087", "uri":"https://site url/_api/SP.ChangeItem", "type":"SP.ChangeItem"}, "ChangeToken":{"__metadata":{"type":"SP.ChangeToken"}, "StringValue":"1;3;482e418a-0900-414b-8902-02248c2e44e8;634955266749500000;5749111"}, "ChangeType":1, "SiteId":"ce11bfbb-cf9d-4b2b-a642-8673bd48cceb", "Time":"2013-02-03T22:17:54Z", "ItemId":1, "ListId":"482e418a-0900-414b-8902-02248c2e44e8", "WebId":"a975b994-fc67-4203-a519-b160175ca967"}] } }
该响应表明添加了单个列表项目(ItemId 值为 1),添加时间以更改日志中的 ChangeToken 表示。 可以使用该对象的字符串值使查询更加精确。 例如,可以指定 ChangeQuery 对象的 ChangeTokenStart 和 ChangeTokenEnd 属性的值,以确保获取在某个时间点之前或之后,或在两个时间点之间发生的更改。
此外,还可以在使用 getListItemChangesSinceToken 方法时使用 ChangeToken 对象的值:
/_api/web/lists/list(guid'<list id>')/getListChangesSinceToken
这个方法仅存在于 REST 接口中。 如果需要了解自添加第一个项目后对该列表中项目的所有更改,则可构建包含更改令牌的 ChangeLogItemQuery 对象:
{ 'query': { '__metadata': { 'type': 'SP.ChangeLogItemQuery' }, 'ChangeToken':'1;3;482e418a-0900-414b-8902-02248c2e44e8;634955266749500000;5749111' } }
SharePoint Server 2013 功能区 本文中讨论的所有操作均适用于 SharePoint Foundation 2013 及 SharePoint Server 2013(因为它们包含了 SharePoint 的核心功能)。 此外,SharePoint REST 接口还提供了许多 SharePoint Server 2013 功能区的功能。 这些功能区不在本文讨论范围内,但您可以参阅 SDK 中的以下资源来获取通过 REST 使用它们的更多信息:
- “SharePoint 2013:在 SharePoint 应用程序中使用搜索 REST 服务”(bit.ly/Mt4szN)
- “使用 SharePoint 2013 中的社交功能进行开发”(bit.ly/102qIGM)
- “SharePoint 2013 BCS REST API 参考”(bit.ly/10FFMMu)
调试
执行 REST 操作所需的最重要的信息当然是正确的 URL。 我们已经提到了很多重要的 URL,关于其他的 URL,您可以参阅 SharePoint SDK。 由于 REST 接口模型建立在客户端对象模型之上,因此,有关 REST 端点 URL 的信息,可以参阅 JavaScript 对象模型参考。 例如,如需查阅哪些 URL 可用于操作列表集合,可以参阅 bit.ly/108hI1e 处的 SP.ListCollection 对象参考文档。
另外,也可以登录用户身份导航至某个 REST URL,并查看任意 GET 请求的 XML 输出,以了解每个端点的可用数据及其组织结构。 这虽然不能帮助您了解 POST 请求,但可帮助您熟悉不同的 SharePoint 实体以及每个端点可用的信息。
从代码发送的 HTTP 请求必须包含经过正确编码的 URL,这非常重要。 当从 SharePoint 启动某个 SharePoint 应用程序时,可以从 SPHostUrl 查询字符串参数检索已编码的 URL,但在其他上下文,您可能不得不手动编码 URL。
在执行更为复杂的操作时,特别是在执行需要 POST HTTP 谓词的操作时,需要使用 HTTP 跟踪实用程序来调试 HTTP 请求。 当请求有误时,SharePoint 会返回错误消息,这些消息可提供许多信息,以便您了解请求为何出错。 例如,您的应用程序或用户可能只是未得到从 SharePoint 获取特定类型信息的授权。 在其他时候,也可能是您构建了一个无效的 JSON 对象,或是为某个属性分配了无效的值。
某些框架会提供 HTTP 跟踪实用程序。 在处理 ASP.NET 应用程序时,可以使用 trace.axd (bit.ly/8bnst4)。 如果是从浏览器直接发送请求(如使用 JavaScript),则可使用 Fiddler (fiddler2.com/fiddler2)。 本文中包含的 HTTP 响应示例就是使用 Fiddler 生成的。
在 PHP 应用程序中借助 REST 与 SharePoint 交互
正如我们在简介中所说的那样,REST 接口允许您从 Web 开发人员常用的任意标准语言或框架与 SharePoint 交互。 出于演示目的,我们发布了一个示例 PHP 应用程序,该应用程序演示了如何从以 PHP 编写的远程 Web 应用程序与 SharePoint 站点交互。 这个特别的应用程序是一个旨在从 Office 365 SharePoint 站点启动并从 Windows Azure Web 站点运行的 SharePoint 应用程序。 这种体系结构简化了某些步骤,如发布 Web 站点,但该示例中的 PHP 代码可在支持 PHP 的任意体系结构上运行。
可以从 bit.ly/ZQsmvP 处的代码库页面查看和下载该示例。 该示例演示了许多内容,包括如何使用 REST 操作文件和文件夹,如何从 PHP 应用程序获取有效的 OAuth 访问令牌,以及如何使用 JavaScript 跨域库。 对于本节最为重要的是,它还演示了如何使用 REST 和 PHP 从 SharePoint 文档库检索文件和向其上传文件。
由于该应用程序需要向 SharePoint 站点写入数据,因而该应用程序需要首先完成的工作(在获取访问令牌之后)之一是从 _api/contextinfo 请求格式摘要。 该请求在报头中传递访问令牌,并设置一个到 SSL URL 的 POST 请求。 如果您用过 PHP 客户端 URL 对象,一定会非常熟悉图 4 中所示的代码。
图 4 请求格式摘要
$opts = array ( 'Authorization: Bearer ' .
$accToken); $ch = curl_init(); $url = $appweburl . '
/_api/contextinfo'; curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_HTTPHEADER, $opts); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, ''); curl_setopt ($ch, CURLOPT_SSL_VERIFYHOST, 0); curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $result = curl_exec($ch);
执行该请求后,应用程序解析 XML 并存储格式摘要值:
$root = new SimpleXmlElement($result); $ns = $root->getNameSpaces(TRUE); $childrenNodes = $root->children($ns['d']); $formValue = $childrenNodes->FormDigestValue;
此外,它还将该访问令牌存储在 cookie 中。 当用户选择上传文件时,应用程序会将这些值传递给一个 HTML 文件(该文件负责构造用于将文件上传至文档库的 HTTP 请求)。 在设置请求前,它将数据从本地存储文件读入到一个字符串对象(该对象将作为 POST 请求的正文进行传递):
$accToken = $_COOKIE["moss_access_token"]; $url = $_REQUEST["target"] .
$furl = $_FILES["file"]["tmp_name"]; $file = fopen($furl,"r"); $post_data = fread($file,filesize($furl)); fclose($file);
图 5 中的行检索格式摘要和访问令牌值,并设置和执行上传文件的 HTTP 请求。
图 5 执行上传文件的请求
"/_api/web/GetFolderByServerRelativeUrl('Lists/SharedDoc')/Files/ add(url='" .
$_FILES["file"]["name"] . "'
,overwrite=true)"; $opts = array ( 'X-RequestDigest:' .
$_REQUEST["digest"], 'Authorization: Bearer ' .
$accToken); // Initialize cURL $ch = curl_init(); curl_setopt($ch, CURLOPT_HTTPHEADER, $opts); // Set URL on which you want to post the Form and/or data curl_setopt($ch, CURLOPT_URL, $url); // Data+Files to be posted curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data); // Pass TRUE or 1 if you want to wait for and catch the // response against the request made curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // For Debug mode; shows up any error encountered during the operation curl_setopt($ch, CURLOPT_VERBOSE, 1); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt ($ch, CURLOPT_SSL_VERIFYHOST, 0); curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, 0); // Execute the request $response = curl_exec($ch);
下一步要做什么?
SharePoint 2013 REST 接口虽在完整性上无法与客户端对象模型媲美,但其覆盖面广、功能强大,足以提供 Web 和移动应用程序开发人员需要的大多数操作(特别是在其使用的是 .NET 以外的框架时)。虽然我们已经概述了借助 REST 接口将 SharePoint 集成到应用程序中的大多数主要方式,但还存在许多其他可行方法。
SharePoint 2013 SDK 包含一组用于 REST 开发的资源,您可以在 MSDN 库文章“SharePoint 2013 REST API、端点和示例”(bit.ly/137q9yk) 中找到所有这些资源的链接。这个资源集合还会继续扩大,并将包含覆盖范围极其广泛的示例,因为正如 PHP 示例演示的那样,REST 接口极大地拓展了 SharePoint 的开发领域。
Jim Crowley 是 Office 部门的资深编程作家。他编写了 SharePoint 2013 的开发人员文档。此外,他还编写了用于 Windows Phone 7 的 SharePoint Developer Documentation RSS Reader 应用程序 (bit.ly/YIVbvY)。
Ricky Kirkham 是 Office 部门的资深编程作家和一名 Microsoft 认证专业开发人员 (SharePoint 2010)。Kirkham 于 2006 年加入 Microsoft 开发人员文档团队,一直负责为 SharePoint 编写相关文档。
衷心感谢以下技术专家对本文的审阅:Jyoti Jacob (Microsoft)