回答

收藏

HTTP 中的 POST 和 PUT 有什么区别?

技术问答 技术问答 243 人阅读 | 0 人回复 | 2023-09-11

根据RFC 2616,§ 9.5,POST用于创建资源:
3 K1 S' t+ C& [! MPOST 方法用于请求源服务器接受请求中包含的实体作为请求行中的请求 URI 标识资源的新从属。1 D8 ~- J; z/ h5 P) F4 B
根据RFC 2616,§ 9.6,PUT用于创建或替换资源:3 X$ D1 m$ l. F9 o/ f
PUT 方法要求在提供的 中存储封闭的实体Request-URI 下。请求 URI 引用现有资源,包含的实体应视为停留在源服务器上的实体的修改版本。Request-URI 不指向现有资源, URI 如果可以被要求的用户代理定义为新资源,则源服务器可以使用 URI 创建资源。
, W: E- e% k4 K5 f  S
那该用哪种 呢?HTTP 创造资源的方法?还是两者都应该支持?1 W# i, y( D5 s( g
                                                               
! k8 F/ m. w( W" k( o    解决方案:                                                               
' S$ Q& P. g. D/ f; m                                                                全面的:* h8 d7 S8 L5 L
PUT 和 POST 可用于创建。1 D, b, X- V3 H3 h) D5 D
你必须问,你在做什么?,以区分你应该用什么。假设你正在设计一个问题 API。若要使用 POST,那么您可以对问题列表执行此操作。若要使用 PUT,那么您将对特定问题执行此操作。
" H* i  `, ?2 c. K6 X( G/ s太好了,两者都可以用,所以我应该在我的 RESTful 设计中使用哪一种:% Z" d! ?- i" y+ e
不需要同时支持 PUT 和 POST。6 b% N' x3 Z3 x6 \6 S
你用什么取决于你。但请记住根据您在请求中引用的对象使用正确的对象。
7 o/ y( j8 S; p8 e& b$ O* U- W一些考虑:
8 A. `9 s$ n# L: i你清楚地命名了你创造的 URL 对象,还是让服务器决定?如果您命名它们,请使用 PUT。如果您让服务器决定,请使用 POST。1 \5 D: s. F% e; j  G+ }
PUT 被定义为假设力等性,所以如果你 PUT 一个对象两次,应该没有额外的影响。这是一个很好的属性,所以我会尽可能多地使用 PUT。只需确保 PUT 幂等性实际上是在服务器中正确实现的。
. e  p: y& ]2 i你可以使用相同的对象 URL 的 PUT 更新或创建资源7 _  a) [/ c: `3 c+ x! W
使用 POST,您可以同时收到 2 的请求URL 进行修改,并且它们可能会更新对象的不同部分。
一个例子:
# p2 g% t& \4 E作为另一个答案的一部分,我写了以下内容:) H# |8 ^7 L. b* D  E# j
POST:
. S3 _7 z5 a9 y/ t修改和更新资源
) L1 }" C! O+ c. Y# T1 J& pPOST /questions/ HTTP/1.1Host: www.example.com/
+ g0 j3 p& N" ]请注意,以下是错误:; @- ?3 K# ?6 j! E: B0 o
POST /questions/ HTTP/1.1Host: www.example.com/
. L1 N2 b( S# S3 d+ |) l" i/ U如果创建 URL,指定名称时不得使用 POST 来创建它。这应该导致“找不到资源”错误,因为不存在。你应该 首先将资源放在服务器上。7 M$ B& y$ C7 G9 t, d. }4 ]
使用 可执行以下操作POST 创建资源:
0 `; b2 u; m9 s, W; B7 L& p7 IPOST /questions HTTP/1.1Host: www.example.com/( t$ ?+ D2 g9 ]+ z
请注意,在这种情况下,没有指定资源名称,新对象 URL 路径将返回给您。. }7 U. G8 {+ j: J' Y
PUT:9 H9 m# c$ [4 {. M. Q/ [
用于创建或覆盖资源。当您指定资源时,新 URL 时。3 B) o" ?* f7 M# l( N
新资源:
7 n+ w7 q0 V: B4 }2 ]3 {  zPUT /questions/ HTTP/1.1Host: www.example.com/- s+ Q/ Q2 u5 n; w
覆盖现有资源:
6 ~; n7 J7 f+ o2 F3 HPUT /questions/ HTTP/1.1Host: www.example.com/! a+ U& V, d9 F) x! Q
另外,更简洁一点,RFC 7231 第 4.3.4 节 PUT状态(添加重点),
8 z( e' W$ j7 L$ ~2 Q9 @3 P, ~4.3.4. PUT:# A- x. @) n* m
PUT 目标资源的状态是 created或replaced包含在请求消息有效负载中的表示定义状态。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则