所以,我想知道我将从RESTful uri GET请求中获得多少结果.我不知道有什么方法可以做到这一点.有没有办法做到这一点?由于REST只抛出属性,我不知道它是否能够计算其结果,但它可以跳过结果并获取结果的子集.
有人有什么建议吗?
哦,我的设置是一个LINQ to SQL,它填充了一个可查询的通用List.数据服务使该列表可用.我已经尝试了对列表的计数,但我总是得到数据库的最大行,这不是我正在寻找的.
其他人可能会反对这个概念,但这对我来说似乎是合理的:
HEAD /your/api HTTP/1.1 HTTP/1.1 200 OK Date: Fri, 23 Oct 2009 00:58:17 GMT Content-Type: application/xml; charset=UTF-8 Content-Length: 89 X-Result-Count: 100000000
然后:
GET /your/api HTTP/1.1 HTTP/1.1 200 OK Date: Fri, 23 Oct 2009 00:58:17 GMT Content-Type: application/xml; charset=UTF-8 Content-Length: 89 X-Result-Count: 100000000100000000 results go here.
注意:此处使用HEAD请求来获取计数,而无需提取完整数据集.HEAD请求仅检索HTTP标头,而不是检索响应的主体.
这将是我能想到的最RESTful方式,表明在通过网络发送之前你会得到多少结果.主要技巧是为它提供最好的标题名称. X-Result-Count
是不错的,但如果你能找到现有的艺术并重新使用他们的标题名称选择,那就更好了(只要他们没有说出真正愚蠢的东西).也就是说,我不指望你会有太多的运气,所以你应该坚持下去X-Result-Count
.
另外,我认为你可能误解了"REST"实际上需要什么.没有理由你不能通过范围给出表示.例如:
GET /your/api?page=1&perpage=10 HTTP/1.1 HTTP/1.1 200 OK Date: Fri, 23 Oct 2009 00:58:17 GMT Content-Type: application/xml; charset=UTF-8 Content-Length: 101 X-Result-Count: 10First 10 results of 100000000 go here.
但是,要成为RESTful,您需要能够通过/your/api?range=0-9
或/your/api?page=1&perpage=10
不使用带外信息告诉客户端所识别的表示.例如,如果您的/your/api
页面返回的结果太多,请执行临时重定向/your/api?page=1&perpage=10
,并包含指向的超链接/your/api?page=2&perpage=10
.请注意,此上下文中的超链接可能是这样的简单:
This is a result. This is also a result.
现在,用于导航API调用结果的信息是带内实际的RESTful.
从本质上讲,REST是一种简单的HTTP,其缓存是正确的,并且通常可以使用合理的URI进行测量.它也是"超文本作为应用程序状态的引擎"(即资源应链接到其他资源).它不是一种协议,它是一种建筑风格.任何以不同方式告诉你的人都最好被命名为Roy Fielding.
http://roy.gbiv.com/untangled/2009/it-is-okay-to-use-post
http://roy.gbiv.com/untangled/2008/rest-apis-must-be-hypertext-driven
http://roy.gbiv.com/untangled/2008/rest-apis-must-be-hypertext-driven#comment-718
附加物:
如果要指示总计数与页数,可以像这样定义标题:
X-Result-Count: 0-9/100000000
或根据需要进行调整.