REST搜索API URI表单

时间:2013-03-17 12:52:42

标签: java rest search naming

我正在实现一个搜索API,它允许搜索系统中的几种类型的对象(客户端,产品等)。哪种形式的URI更可取:

/clients/search
/products/search
...

/search/clients
/search/products
...

/ clients,/ products资源已存在用于其他目的。

编辑:

我认为这不重要,但似乎确实如此,所以 - 搜索可能很复杂,需要POST而不是GET

谢谢,

亚历

3 个答案:

答案 0 :(得分:2)

如果它是一个宁静的API,您不需要在URI中使用“搜索”一词,因为产品是资源,而HTTP方法GET提供动词。所以你可以做类似的事情;

  • GET /product/998827727/(按ID检索产品)
  • GET /product/?searchTerm=thingybob(查找带搜索字词的产品)

也就是说,有时您的搜索字词太复杂,因此您需要一个实用程序资源,因此您可以执行POST /product-search/POST /product/search/之类的操作,因为产品是主要资源

答案 1 :(得分:1)

这个建议看起来很合理:https://blog.apigee.com/detail/restful_api_design_tips_for_search所以根据这个:

/clients/search
/products/search
...

Tweeter使用不一致的结构:

Splunk更喜欢search为第一名:http://docs.splunk.com/Documentation/Splunk/5.0.2/RESTAPI/RESTsearches

所以这些例子表明没有一种最好的方法可以做到这一点。我认为当你想要将查询限制为先验已知资源时,最好先使用第一个例子。否则使用全局搜索 - /search并将所有其他编码为参数(请参阅Freebase API:https://developers.google.com/freebase/v1/search - 他们有自己的查询语言...)。

答案 2 :(得分:1)

这两种方法都是错误的恕我直言。

问题:如果我向您的服务发送以下HTTP请求,我会得到什么:

GET /clients/search
Host: service.org

GET /products/search
Host: service.org

GET /search/clients
Host: service.org

GET /search/products
Host: service.org

如果/ search和/ products资源已经存在,为什么不重用它们,只是在搜索时发送必要的查询参数?例如:

GET /clients?gender=female&country=US
Host: service.org

如果客户端对“/ clients”服务的请求将响应所有客户端的列表,如果URI包含查询参数,则服务将使用过滤结果进行响应。我认为创建这样的专用资源进行搜索没有任何价值。

P.S。 Twitter的URI非常糟糕。