我应该如何在RESTful Web服务中实现COUNT动词?

时间:2011-03-22 15:24:12

标签: api http rest

我编写了一个支持标准CRUD操作的RESTful Web服务,它可以返回一组符合特定条件的对象(SEARCH动词),但是我想添加一个更高阶的COUNT动词,所以客户可以计算匹配搜索条件的资源,而无需获取所有资源。

我遇到的一些选择:

  • 忽略HTTP规范并在HEAD请求的响应正文中返回对象计数。

  • 复制SEARCH动词的逻辑,但是发出HEAD请求而不是GET请求。然后,服务器将在响应头中编码对象计数。

  • 定义一个新的HTTP方法COUNT,它返回响应正文中的对象计数。

我更喜欢第一种方法的API,但我必须选择该选项,因为它不符合要求。第二种方法似乎在语义上最正确,但API不是很方便:客户端必须处理响应头,大多数时候他们希望能够做一些像response.count这样简单的事情。所以我倾向于第三种方法,但我担心定义新的HTTP方法可能会遇到的问题。

你会做什么?

3 个答案:

答案 0 :(得分:18)

您可以在不破坏HTTP规范的情况下使用HEAD,并且可以通过在响应中使用HTTP Range标头来指示计数:

HEAD /resource/?search=lorem

来自服务的响应,假设您默认返回前20个结果:

...
Content-Range: resources 0-20/12345
...

这样,您可以在响应消息的标头内将资源量传输到客户端,而无需返回消息正文。

<强>更新
建议Yannick Loiseau的解决方案可以正常工作。只是想提供另一种替代方法,可以用来实现你所需要的,而无需定义一个新的动词资源。

您可以使用GET并将计数添加到邮件正文中。然后,如果API允许客户端请求一系列结果,您可以使用它来将消息体的大小限制到最小(因为您只需要计数)。一种方法是请求空范围(从0到0),例如:

GET /resource/?search=lorem&range=0,0

然后,服务可以如下响应,表明结果集中有1234个匹配资源:

<?xml version="1.0" encoding="UTF-8" ?>
<resources range="0-0/1234" />

答案 1 :(得分:16)

休息的主要目的是定义一组使用定义明确的动词进行交互的资源。因此,您必须避免定义自己的动词。资源的数量应该被视为一个不同的资源,它有自己的uri,你可以简单地获取。 例如:

GET resources?crit1=val1&crit2=val2

返回资源列表和

GET resources/count?crit1=val1&crit2=val2

另一个选择是使用连接:例如Accept: text/uri-list返回资源列表,Accept: text/plain仅返回计数

答案 2 :(得分:5)

  

忽略HTTP规范并在HEAD请求的响应主体中返回对象计数。

恕我直言,这是一个非常糟糕的主意。它可能无法正常工作,因为您可能有中间人不会忽略HTTP规范。

  

定义一个新的HTTP方法COUNT,它返回响应主体中的对象计数。

这种方法没有问题。 HTTP是可扩展的,您可以定义自己的动词。有些防火墙禁止这样做,但它们通常也禁止POST和DELETE,并广泛支持X-HTTP-Method-Override标头。

另一个选项,即向您的网址添加查询参数,例如:?countOnly = true