获取RESTful请求所看到的返回计数

时间:2009-10-23 00:49:02

标签: entity-framework rest

所以,我想知道我将从RESTful uri GET请求中获得多少结果。我不知道有什么方法可以做到这一点。有没有办法做到这一点?由于REST只抛出属性,我不知道它是否能够计算其结果,但它可以跳过结果并获取结果的子集。

有人有什么建议吗?

哦,我的设置是一个LINQ to SQL,它填充了一个可查询的通用List。数据服务使该列表可用。我已经尝试过对列表进行计数了,但是我总是得到数据库的最大行数,这不是我想要的。

4 个答案:

答案 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资源名称设计中处理此问题。你可以从以下内容开始:

  • / widget / 12345(小部件12345的表示)
  • / widgets(所有小部件资源名称的列表,即链接)

您可能会很快决定“/ widgets”将是一个庞大的列表并决定支持页面,例如

  • / widgets / page / 43(这可能包含第4200到第4299个窗口小部件的链接,以及其他信息,例如总页数或窗口小部件的数量。)

在其他情况下,您可以将大型集合细分为自然层次结构:

  • / widgets / mahogany,/ widgets / oak,...
  • / movies / drama,/ movies / romance,...
  • / computers / harddrives / seagate,/ computers / usbdrives / kingston

您也可以定义查询:

  • /小部件maxprice = 200安培; maxweight = 4

答案 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>