【问题标题】:REST API routing with params good practice带有参数的 REST API 路由良好实践
【发布时间】:2021-01-03 11:41:14
【问题描述】:

我的服务器有路由:

/api/debts/:id

获取有关特定债务的信息和

/api/debts/search?searchData=something

用某物来追债。

第一条路线总是处理搜索请求。我想更改它并知道如何以多种方式进行(只需删除第二条路线中的 /api/debts 等),但我想知道一个好的做法。

UPD:还有路线

/api/debts

讨债

【问题讨论】:

    标签: api rest routes backend


    【解决方案1】:

    对于搜索或过滤目的,/api/debts?searchData=something 是首选。

    /api/debts/search?searchData=something 中,这不被认为是好的,因为它有search,它是verb,而searchDataresources 之外。

    详情请参考 here

    【讨论】:

    • 对不起,我没有标明我也有路由:GET /api/debts 得到所有的债务。它在 /api/debts?searchData=something 之前处理请求
    • 仍然,单个资源应该可以工作,在接收请求参数时,他们可以在Map 中接收,这样如果没有传入参数,您可以返回所有debts 其他明智的返回结果之后过滤或搜索等...
    【解决方案2】:

    我想更改它并知道如何以多种方式进行(只需删除第二条路线中的 /api/debts 等),但我想知道一个好的做法。

    REST 不关心您为资源标识符使用的拼写约定。

    因此,如果您出于其他顾虑而决定要使用不同的path,请继续这样做。

    /debts/search?searchData=something
    /search/debts?searchData=something
    

    这些都很好。在前面粘贴额外的路径段(如api)也很好。通用客户端不在乎,因为他们只是将标识符复制到request line


    这不被认为是好的,因为它有搜索它的动词

    考虑下面的 URI

    https://www.merriam-webster.com/dictionary/search

    有效,完全符合您的预期,即使“搜索”恰好是英语中的动词(有时)。

    在你的标识符中使用注册的 HTTP 方法甚至是可以的:

    GET /dictionary/delete HTTP/1.1
    Host: www.merriam-webster.com
    

    您可以在网络浏览器中点击 https://www.merriam-webster.com/dictionary/delete

    工作特别好的是假设标识符定义了请求语义; request method 是传达请求语义的适当机制,而不是标识符。换句话说

    GET /delete
    

    是一个承诺safe语义的请求;如果您通过进行大量破坏性编辑来处理该请求,那么这就是fault of the implementation


    这里的混淆当然不是 Raj 的错——网络上有很多文献 (a) 描述了资源标识符的任意拼写约束,并且 (b) 引用“REST”作为这些约束的权威。

    (b) 部分没有事实依据 - 只是民间传说获得了关注。

    REST 不关心标识符的拼写约定,就像编译器不关心变量名的拼写约定一样。

    REST 非常关心两个标识符何时相同,因为caching,尤其是cache invalidation,对于通用组件能够正确执行非常重要。

    但机器不区分名词、动词、hmac 代码、rot13 密码等。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-04-23
      • 2018-12-02
      • 1970-01-01
      • 1970-01-01
      • 2011-09-28
      • 2018-08-27
      • 1970-01-01
      相关资源
      最近更新 更多