【发布时间】:2021-01-03 11:41:14
【问题描述】:
我的服务器有路由:
/api/debts/:id
获取有关特定债务的信息和
/api/debts/search?searchData=something
用某物来追债。
第一条路线总是处理搜索请求。我想更改它并知道如何以多种方式进行(只需删除第二条路线中的 /api/debts 等),但我想知道一个好的做法。
UPD:还有路线
/api/debts
讨债
【问题讨论】:
我的服务器有路由:
/api/debts/:id
获取有关特定债务的信息和
/api/debts/search?searchData=something
用某物来追债。
第一条路线总是处理搜索请求。我想更改它并知道如何以多种方式进行(只需删除第二条路线中的 /api/debts 等),但我想知道一个好的做法。
UPD:还有路线
/api/debts
讨债
【问题讨论】:
对于搜索或过滤目的,/api/debts?searchData=something 是首选。
在/api/debts/search?searchData=something 中,这不被认为是好的,因为它有search,它是verb,而searchData 在resources 之外。
详情请参考 here
【讨论】:
Map 中接收,这样如果没有传入参数,您可以返回所有debts 其他明智的返回结果之后过滤或搜索等...
我想更改它并知道如何以多种方式进行(只需删除第二条路线中的 /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 密码等。
【讨论】: