回答

收藏

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

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

根据RFC 2616,§ 9.5,POST用于创建资源:
; X0 g' T  w6 P$ S- J+ HPOST 方法用于请求源服务器接受请求中包含的实体作为请求行中的请求 URI 标识资源的新从属。- A, f, @/ N% v0 p
根据RFC 2616,§ 9.6,PUT用于创建或替换资源:+ ?2 w5 W) |6 l# X; V" ^0 V
PUT 方法要求在提供的 中存储封闭的实体Request-URI 下。请求 URI 引用现有资源,包含的实体应视为停留在源服务器上的实体的修改版本。Request-URI 不指向现有资源, URI 如果可以被要求的用户代理定义为新资源,则源服务器可以使用 URI 创建资源。0 r7 F' P. l4 Y; [3 }
那该用哪种 呢?HTTP 创造资源的方法?还是两者都应该支持?  t* T7 j' s8 p" E$ k, r! C2 P- j
                                                                3 ~6 E$ P. d; Q( |# {/ R4 F- ?1 E- B
    解决方案:                                                               
8 z3 |2 W3 f5 \1 H1 o& B                                                                全面的:
7 J6 X( Y/ n, d% Z8 `- p( @/ _3 }PUT 和 POST 可用于创建。1 g- L  |) F) V
你必须问,你在做什么?,以区分你应该用什么。假设你正在设计一个问题 API。若要使用 POST,那么您可以对问题列表执行此操作。若要使用 PUT,那么您将对特定问题执行此操作。- G" e2 |$ W9 `) c. o! G
太好了,两者都可以用,所以我应该在我的 RESTful 设计中使用哪一种:% G- S: h* C" s0 F4 W( E
不需要同时支持 PUT 和 POST。+ G) n- s0 V0 Z9 {+ }
你用什么取决于你。但请记住根据您在请求中引用的对象使用正确的对象。7 E  ?; L% }! }: P) L
一些考虑:
) n6 h* e/ S; i) Z$ B, s. b1 n+ g你清楚地命名了你创造的 URL 对象,还是让服务器决定?如果您命名它们,请使用 PUT。如果您让服务器决定,请使用 POST。
0 m5 C% U7 A+ s. U' ePUT 被定义为假设力等性,所以如果你 PUT 一个对象两次,应该没有额外的影响。这是一个很好的属性,所以我会尽可能多地使用 PUT。只需确保 PUT 幂等性实际上是在服务器中正确实现的。3 v% w6 N% K6 C
你可以使用相同的对象 URL 的 PUT 更新或创建资源) i9 s; b4 m* L# R# u# C% n! q0 f
使用 POST,您可以同时收到 2 的请求URL 进行修改,并且它们可能会更新对象的不同部分。
一个例子:
2 R  v5 ?8 \, B  L9 v作为另一个答案的一部分,我写了以下内容:2 s$ c$ G4 w/ \
POST:
- v1 `2 V+ q& k( I3 M9 X3 k& p. U修改和更新资源" U: r/ U5 c8 C
POST /questions/ HTTP/1.1Host: www.example.com/
9 W1 W# z3 b" E请注意,以下是错误:$ @5 Q4 W5 J$ u. c; a/ j' a  {& ?
POST /questions/ HTTP/1.1Host: www.example.com/9 k4 A0 e2 J. n+ ]( s# n
如果创建 URL,指定名称时不得使用 POST 来创建它。这应该导致“找不到资源”错误,因为不存在。你应该 首先将资源放在服务器上。
- d  m% m. P8 y5 q! g. I/ u使用 可执行以下操作POST 创建资源:) f& }* F( j" S+ Q" @
POST /questions HTTP/1.1Host: www.example.com/
. W. y# f  w: ?请注意,在这种情况下,没有指定资源名称,新对象 URL 路径将返回给您。
6 r5 O) F1 U% N2 qPUT:7 M4 L( f: V# Z! P$ ]6 c: r# z& F
用于创建或覆盖资源。当您指定资源时,新 URL 时。5 h  E$ A6 z! u; z& `" @# i
新资源:2 l% z( G/ P, I
PUT /questions/ HTTP/1.1Host: www.example.com/
. T7 Y# ~$ C# P1 Q" Z$ ?' t覆盖现有资源:
8 l5 U: a1 I0 ePUT /questions/ HTTP/1.1Host: www.example.com/
; ~  A: J6 s: S, J/ E* J( z另外,更简洁一点,RFC 7231 第 4.3.4 节 PUT状态(添加重点),& ?5 ]0 C  C; Y3 J* m' m
4.3.4. PUT:
& |8 C/ A+ Q* w- \+ `. cPUT 目标资源的状态是 created或replaced包含在请求消息有效负载中的表示定义状态。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则