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

entity-framework rest

所以,我想知道我将从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: 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

或根据需要进行调整。


热门答案

为什么不让资源处理该类型元数据的查询?假设

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>


许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因
许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因