为什么要使用HTTP动词?

5

动词是针对像server.domain/getallrecords或server.domain/delete1record这样的URL的。而getallrecords、delete1record等都是为特定目的而设计的,那么为什么我们需要在这里使用动词呢?

与对server.domain/getallrecords进行的get调用有什么区别?

server.domain/getallrecords or 
server.domain/delete1record 

或者向上述任何URL发出put(或post或delete)调用?
2个回答

10

如果你选择使用RPC方式,似乎HTTP动词是无用的。

REST风格的HTTP服务中,HTTP动词是它的好伙伴,因为基于资源的URI不会包含操作标识符而是资源本身。

例如,server.domain/getallrecords将变成server.domain/records,如果你用HTTP/GET请求这个资源,资源将被映射到一个服务器方法,该方法将返回所有记录。如果使用HTTP/POST执行相同的请求,则会创建新的记录等等。

你需要决定:选择RPC还是REST,并根据此选择是否感觉有用。我建议使用HTTP动词是一种使用众所周知的协议 - HTTP - 的好方法,可以使用预定义的动词,而不是发明自己的动词。但再次强调,这取决于您自己的想法、偏好和要求。


1
请允许我补充一下这个答案,您的默认跨域引用保护将默认防止访问诸如“DELETE”、“POST”和“PUT”等动词。如果您对所有内容都使用“GET”,那么恶意站点可能会使用类似<img src="http://server.domain/delete1record" />的代码来触发所有访问用户的删除尝试。如果您的授权用户之一访问了此站点,则可能会遇到麻烦。 - tom.dietrich
1
@tom.dietrich 顺便说一下,使用“GET”动词删除记录的情况只是设计缺陷,不是吗? - Matías Fidemraizer
我不认为ASP.NET默认阻止跨域的GET请求,但我可能错了。如果不是简单地检索数据,我绝对建议不要使用GET - tom.dietrich
@tom.dietrich 我已经删除了所有的评论。现在我知道它们是无用讨论的一部分,对我的回答和OP的问题没有任何价值。现在轮到你这样做了,因为你的评论对未来的访问者没有帮助。添加你自己的答案,解释你自己的想法,这就是SO的工作方式。 - Matías Fidemraizer

1
在一个REST API中,假设你有四个用于库存API的端点:
1. 用于创建项目 2. 用于修改(编辑操作)项目 3. 用于删除项目 4. 用于查看项目
API端点将如下所示: - servername.domain/createItem - servername.domain/editItem - servername.domain/deleteItem - servername.domain/viewItems
但是如果我们使用动词,我们只需要一个端点,因为该端点可以根据HTTP动词确定要执行的操作。
- servername.domain/inventory
如果该端点接收到GET请求,则是/viewItems; 如果该端点接收到POST请求,则是/createItems; 如果该端点接收到PUT请求,则是/editItems; 如果该端点接收到DELETE请求,则是/deleteItems。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接