我正在实现一个搜索API,它允许搜索系统中的几种类型的对象(客户端,产品等)。哪种形式的URI更可取:
/clients/search
/products/search
...
或
/search/clients
/search/products
...
/ clients,/ products资源已存在用于其他目的。
编辑:
我认为这不重要,但似乎确实如此,所以 - 搜索可能很复杂,需要POST而不是GET
谢谢,
亚历
答案 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非常糟糕。