HTTP 中的 POST 和 PUT 有什么区别?
技术问答
179 人阅读
|
0 人回复
|
2023-09-11
|
根据RFC 2616,§ 9.5,POST用于创建资源:
7 J7 j) q0 P) k( ZPOST 方法用于请求源服务器接受请求中包含的实体作为请求行中的请求 URI 标识资源的新从属。" W1 I- [4 u% w- r8 C, b
根据RFC 2616,§ 9.6,PUT用于创建或替换资源:* L% K+ [ J; H# x
PUT 方法要求在提供的 中存储封闭的实体Request-URI 下。请求 URI 引用现有资源,包含的实体应视为停留在源服务器上的实体的修改版本。Request-URI 不指向现有资源, URI 如果可以被要求的用户代理定义为新资源,则源服务器可以使用 URI 创建资源。) A& W( T+ N6 M9 ]* _
那该用哪种 呢?HTTP 创造资源的方法?还是两者都应该支持?
J' z# t( j& J0 A6 ^6 V + Y3 N3 j% c3 c8 h
解决方案:
5 `. q' j- {" k/ k0 y 全面的:
1 J" k+ _3 [8 N, L/ CPUT 和 POST 可用于创建。
: v, X% x( U# w* [' O) B8 C你必须问,你在做什么?,以区分你应该用什么。假设你正在设计一个问题 API。若要使用 POST,那么您可以对问题列表执行此操作。若要使用 PUT,那么您将对特定问题执行此操作。
. w# }: ]9 Y" `0 W& X$ E太好了,两者都可以用,所以我应该在我的 RESTful 设计中使用哪一种:* d, N; J D, O* H4 z8 y( Q: e6 Q4 I
不需要同时支持 PUT 和 POST。
4 V" p. L% b5 V( M$ D9 E3 p你用什么取决于你。但请记住根据您在请求中引用的对象使用正确的对象。7 S5 a& W# r5 D7 v9 R* n4 j
一些考虑:
' {' ?: Z0 p0 W+ n2 M6 q你清楚地命名了你创造的 URL 对象,还是让服务器决定?如果您命名它们,请使用 PUT。如果您让服务器决定,请使用 POST。1 a D6 J7 I' y" c9 D
PUT 被定义为假设力等性,所以如果你 PUT 一个对象两次,应该没有额外的影响。这是一个很好的属性,所以我会尽可能多地使用 PUT。只需确保 PUT 幂等性实际上是在服务器中正确实现的。
7 r& H$ b i0 K5 }你可以使用相同的对象 URL 的 PUT 更新或创建资源
- w- n5 J1 i6 N1 `, q: z使用 POST,您可以同时收到 2 的请求URL 进行修改,并且它们可能会更新对象的不同部分。一个例子:1 K6 ]8 Q9 g s1 V( ^1 s$ _
作为另一个答案的一部分,我写了以下内容:! } S" L" w5 c! Y0 o! ?" s/ f
POST:+ i- f Z1 {" I
修改和更新资源
2 _/ T2 [; j+ {" w- qPOST /questions/ HTTP/1.1Host: www.example.com/# s; }! u) \- ]! \
请注意,以下是错误:
w, X2 }$ u* E& P2 H+ z* A/ Y4 uPOST /questions/ HTTP/1.1Host: www.example.com/! M$ Y% @( W8 {# f6 d$ C3 d6 g
如果创建 URL,指定名称时不得使用 POST 来创建它。这应该导致“找不到资源”错误,因为不存在。你应该 首先将资源放在服务器上。
& z% ~4 K g/ h使用 可执行以下操作POST 创建资源:
! N( P2 j2 c7 h# V" uPOST /questions HTTP/1.1Host: www.example.com/
5 E- A9 m0 Q1 Z, l; _% P9 ?请注意,在这种情况下,没有指定资源名称,新对象 URL 路径将返回给您。
3 @/ F# f# ?3 I/ YPUT:+ z. Z( @7 Y3 u2 ?- m
用于创建或覆盖资源。当您指定资源时,新 URL 时。
% A2 q' L% y# f# Q0 r V0 T新资源:
; p8 U: L5 J/ R5 J7 B- BPUT /questions/ HTTP/1.1Host: www.example.com/
; F& g- ~ r- Z o9 r! O覆盖现有资源:
' m; {5 Q$ u% e }& ~PUT /questions/ HTTP/1.1Host: www.example.com/; l1 G+ M" S$ o
另外,更简洁一点,RFC 7231 第 4.3.4 节 PUT状态(添加重点),
7 c/ Y K2 s) j5 }' p8 O4.3.4. PUT:
' X+ ^! Z1 H: J" T' `% vPUT 目标资源的状态是 created或replaced包含在请求消息有效负载中的表示定义状态。 |
|
|
|
|
|