我正在实现一个搜索 API,它允许搜索系统中的多种类型的对象(客户端、产品等)。哪种形式的 URI 更可取:
/clients/search
/products/search
...
或者
/search/clients
/search/products
...
/clients, /products 资源已经存在用于其他目的。
编辑:
我认为这无关紧要,但似乎确实如此,所以 - 搜索可能足够复杂,需要 POST 而不是 GET
谢谢,
亚历克斯
这个建议看起来很合理:https ://blog.apigee.com/detail/restful_api_design_tips_for_search所以根据这个:
/clients/search
/products/search
...
高音使用不一致的结构:
Splunk 更喜欢search
成为第一的概念:http: //docs.splunk.com/Documentation/Splunk/5.0.2/RESTAPI/RESTsearches。
因此,这些示例表明,没有单一的最佳方法可以做到这一点。我认为当您想将查询限制为先验已知资源时,最好使用第一个示例。否则使用全局搜索 -/search
将所有其他编码为参数(参见 Freebase API:https ://developers.google.com/freebase/v1/search - 他们有自己的查询语言......)。
如果它是一个 RESTful API,则不需要在 URI 中使用“搜索”一词,因为产品是资源,HTTP 方法 GET 提供了动词。所以你可以做类似的事情;
GET /product/998827727/
(通过 id 检索产品)GET /product/?searchTerm=thingybob
(使用搜索词查找产品)也就是说,有时您的搜索词太复杂了,所以您需要一个实用资源,然后您就可以做类似的事情,POST /product-search/
或者POST /product/search/
因为产品是主要资源
恕我直言,这两种方法都是错误的。
问题:如果我向您的服务发送以下 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 包含查询参数服务将响应过滤结果。我认为创建这样的专用搜索资源的价值为零。
PS Twitter 的 URI 很糟糕。