所以,我想知道我将从RESTful uri GET请求中获得多少结果。我不知道有什么方法可以做到这一点。有没有办法做到这一点?由于REST只抛出属性,我不知道它是否能够计算其结果,但它可以跳过结果并获取结果的子集。
有人有什么建议吗?
哦,我的设置是一个LINQ to SQL,它填充了一个可查询的通用List。数据服务使该列表可用。我已经尝试过对列表进行计数了,但是我总是得到数据库的最大行数,这不是我想要的。
答案 0 :(得分:20)
其他人可能会反对这个概念,但这对我来说似乎是合理的:
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: 100000000
<?xml version="1.0" encoding="UTF-8"?>
<results>
100000000 results go here.
</results>
注意:此处使用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: 10
<?xml version="1.0" encoding="UTF-8"?>
<results>
First 10 results of 100000000 go here.
</results>
但是,要成为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
的超链接。请注意,此上下文中的超链接可能很简单:
<?xml version="1.0" encoding="UTF-8"?>
<results>
<result>
This is a result.
</result>
<result>
This is also a result.
</result>
<link rel="next" href="/your/api?page=3&perpage=2" />
<link rel="prev" href="/your/api?page=1&perpage=2" />
</results>
现在,用于导航API调用结果的信息是带内的,实际上是RESTful。
基本上,REST是普通的HTTP,其缓存是正确的,并且通常可以使用合理的URI进行测量。它也是“超文本作为应用程序状态的引擎”(即资源应链接到其他资源)。它不是一种协议,它是一种建筑风格。任何以不同方式告诉你的人都最好被命名为Roy Fielding。
<强>附录强>
如果要指示总计数与页数,可以像这样定义标题:
X-Result-Count: 0-9/100000000
或根据需要进行调整。
答案 1 :(得分:0)
为什么不让REST Web服务只是将数据作为JSON或XML返回,并且在那里你可以有一个关于长度的属性。
答案 2 :(得分:0)
您应该能够在REST资源名称设计中处理此问题。你可以从以下内容开始:
您可能会很快决定“/ widgets”将是一个庞大的列表并决定支持页面,例如
在其他情况下,您可以将大型集合细分为自然层次结构:
您也可以定义查询:
答案 3 :(得分:0)
为什么不让资源处理针对该类型元数据的查询?假设
GET /items
返回您的项目列表:
<items count="5" modified="2009-10-22">
<item url="/items/first" name="First Item" />
<item url="/items/second" name="Second Item" />
...
</items>
然后像:
GET /items?info
可以返回一个这样的空列表:
<items count="5" modified="2009-10-22" type="info" />
或者可能是这样的通用信息文档:
<info>
<items count="5" modified="2009-10-22" url="/items" />
</info>
您还可以实现这样的“信息”资源:
GET /info?items&users
可能会返回:
<info>
<items count="5" modified="2009-10-22" url="/items" />
<users count="8" modified="2009-10-05" url="/users" />
</info>