您的位置:首页 > 其它

SharePoint 2003 用REST方式访问列表 Filter等高级操作。

2016-05-30 11:44 357 查看
首先为了方便在chrome 里调试Rest 结果。这里先介绍如URL
Title%20eq%20%27test%27' target='_blank'>https://xxx.xxx.com.cn/itc/_api/web/GetFolderByServerRelativeUrl('JSdocs')/files?$filter=Title%20eq%20%27test%27
说明:使用这个句子: https://xxx.xxx.com.cn/itc/_api/web/GetFolderByServerRelativeUrl('JSdocs')/files 是检查文档库 JSdocs 下面的所有文件。

整个代码是 查找文库Tilte 等于 test 其结果如下图。



其中REST的一些高级操作,在前面的文章里有介绍,这里再复制一下。


高级操作

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) 签入。

REST协议的一个特点,就是可以把我们需要的操作都浓缩在一个URL中(比如通过:_vti_bin/listdata.svc/Test(3)就可以获取到Test这个列表中ID为3的那个条目的信息,当然也可以通过一些特殊的写法实现简单的查询、排序功能),并可以通过GET、POST、PUT、DELETE、MERGE这几种HTTP访问方式,来实现列表数据的增、删、查、改。

通过REST协议访问数据的原理如下图所示:图来自于 MSDN



通过这种方式访问的时候,客户端使用JSON的格式把需要的数据通过某种HTTP方法发送至包含listdata.svc的Url地址上(如果是Get方法的话,就没有发送的数据),然后返回数据的时候,可以返回Xml格式(Atom协议),当然也可以返回JSON格式(如果不特别声明的话,默认使用Atom协议,也就是Xml格式)。

和客户端对象模型相同的是,我们通过Url,可以定义所需要返回的那些字段值,从而减少客户端和服务器端的数据传递大小。

获取指定字段数据  $select 
http://localhost/_vti_bin/ListData.svc/Test?$select=*       //获取Test表所有可用字段

http://localhost/_vti_bin/ListData.svc/Test?$select=Name,Url,Description        //获取Test表中字段名称为Name、Url、Description三个字段

获取前n条数据 $top
http://localhost/_vti_bin/ListData.svc/Test?$top=n       //获取Test表中的前n条数据   n为大于0的正整数

根据某字段排序  $orderby 支持多字段排序,字段间以逗号隔开 
http://localhost/_vti_bin/ListData.svc/Test?$orderby=PublishDate asc            //按PublishDate字段升序 支持asc/desc 

按条件晒选 $filter 
http://localhost/_vti_bin/ListData.svc/Test?$filter=Id le 10                 //晒选Id小雨等于10的项目

 

支持的运算符

数字:Lt、Le、Gt、Ge、Eq、Ne 

字符串:startsWith、substringof、Eq、Ne 

日期时间:day()、month()、year()、hour()、minute()、second() 

实现比较复杂的查询

http://localhost/_vti_bin/ListData.svc/Test
       ?$select=* 

             &$orderby=PublishDate,Id desc 

                    &$top=10 

                         &$filter=Id Ge 3

//选择Test表所有可用字段Id大于等于3的项目中的前10条记录,并按照PublishDate字段、Id字段降序排列
利用$select选择指定列的数据、$orderby按某字段排序、$filter晒选数据时,若字段为系统内置字段,则字段名称为当前语言环境下的字段名称。例如中文「标题」字段,不能写为Title。必须为「标题」。
用户自己添加的英文字段,字段名称首字母必须为大写。例如,新建字段命名为name,此字段作为url一部分时必须写为Name。
另外,若用中文当做Url的一部分,会发生异常,此时要先把中文字段编码,然后把编码后的字段名称变量拼接到Url中

例如:var createDate = encodeURIComponent("标题"); 

var url = "/_vti_bin/ListData.svc/Test?$select=* 

&$orderby=" + createDate + " asc 

&$top=10& 

$filter=Name ne 'bear'"; 

利用$filter晒选数据时,只能有一个晒选条件。
复杂查询时,拼接Url时,须按照$select->$orderby->$top->$filter的顺序。

 


REST的使用方法                                                                                               

本节只介绍Jquery ajax以get方式异步请求。如果不指定数据的请求格式,则REST默认返回数据格式为XML格式。若要返回格式为json,则指定ajax请求的dataType:’json’或contentType:’application/json’即可。

调用代码如下: 
var createDate = encodeURIComponent("标题"); 

var url = "/_vti_bin/ListData.svc/Test?$select=* 

             &$orderby=" + createDate + " asc 

                      &$top=10& 

                            $filter=Name ne 'bear'";

$.ajax({ 

        type: 'get', 

        dataType: 'json', 

        url: url, 

        success: function (data) { 

            //result = data.d.results;  //查询所有列表项 

            result = data.d; //带条件查询 或$top=n 

        }, 

        error: function (a, b, c) { 

            alert(a + b + c); 

        }, 

        complete: function () { 

            callback(result); 

        } 

    });

注:当查询所有列表项为全部是result = data.d.results; 

带$filter或者$top时,result = data.d

问题:由于$filter只支持单个条件,所以对于复杂的查询要求可能无法直接达到要求。 

妥协方式:先根据Url按某条件筛选,然后在ajax请求完成后对结果进行进一步加工处理

 

重点实例:

 //var date = new Date('2015-08-17T03:39:07Z');

 //paramFilter += " and Modified ge datetime('" + new Date().toISOString() + "') ";

参考文档: 
http://msdn.microsoft.com/zh-SG/library/fp142385
http://blog.sina.com.cn/s/blog_5d93d7aa0101c5lt.html
http://technet.microsoft.com/zh-cn/magazine/gg552613(office.14).aspx
http://msdn.microsoft.com/en-us/library/ff798339.aspx

官方视频介绍

https://msdn.microsoft.com/library/office/jj860569%28v=office.15%29.aspx?f=255&MSPPError=-2147217396


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: