HTTP 中的 POST 和 PUT 有什么区别?
技术问答
282 人阅读
|
0 人回复
|
2023-09-11
|
根据RFC 2616,§ 9.5,POST用于创建资源:
1 I/ p8 x Y% G8 `POST 方法用于请求源服务器接受请求中包含的实体作为请求行中的请求 URI 标识资源的新从属。0 }9 L, f8 s3 m
根据RFC 2616,§ 9.6,PUT用于创建或替换资源:
/ r4 y0 o+ w% MPUT 方法要求在提供的 中存储封闭的实体Request-URI 下。请求 URI 引用现有资源,包含的实体应视为停留在源服务器上的实体的修改版本。Request-URI 不指向现有资源, URI 如果可以被要求的用户代理定义为新资源,则源服务器可以使用 URI 创建资源。1 P/ b4 ]/ U- y7 H8 `' @' t* T. s
那该用哪种 呢?HTTP 创造资源的方法?还是两者都应该支持?
4 A) H6 y. y! V! B1 \0 z ( s/ o1 r5 A5 ?: z
解决方案:
3 [" E" B \0 l' Q' | 全面的:
4 ~7 k# s# L1 i* [: KPUT 和 POST 可用于创建。
+ b$ W7 Q2 ~+ D+ B你必须问,你在做什么?,以区分你应该用什么。假设你正在设计一个问题 API。若要使用 POST,那么您可以对问题列表执行此操作。若要使用 PUT,那么您将对特定问题执行此操作。4 @) s' }* F/ V( z9 e6 ]
太好了,两者都可以用,所以我应该在我的 RESTful 设计中使用哪一种:9 y6 U% U$ B; ~- z$ d# n% A1 R
不需要同时支持 PUT 和 POST。
0 e0 S# j( f! a你用什么取决于你。但请记住根据您在请求中引用的对象使用正确的对象。
: J4 s9 r% v4 M' a, r. o% l& p一些考虑:# O1 L# U0 ~ C! R4 J% @1 z
你清楚地命名了你创造的 URL 对象,还是让服务器决定?如果您命名它们,请使用 PUT。如果您让服务器决定,请使用 POST。
3 M6 L' k6 }8 b: APUT 被定义为假设力等性,所以如果你 PUT 一个对象两次,应该没有额外的影响。这是一个很好的属性,所以我会尽可能多地使用 PUT。只需确保 PUT 幂等性实际上是在服务器中正确实现的。
+ x0 m- D* Y+ X/ b1 |1 E% @你可以使用相同的对象 URL 的 PUT 更新或创建资源
" }; n% k, i7 R# v使用 POST,您可以同时收到 2 的请求URL 进行修改,并且它们可能会更新对象的不同部分。一个例子:( K. R# v( h& H- f
作为另一个答案的一部分,我写了以下内容:4 b: f% u$ Z+ u# t A; V: a$ r
POST:
9 I+ a e, M4 ~' n( H: Q3 {% j& v+ U修改和更新资源1 r5 ?# J5 w1 D- `9 Q2 [3 S* M0 P
POST /questions/ HTTP/1.1Host: www.example.com/
: L3 N/ h% b3 V* B7 ?: H2 C$ M请注意,以下是错误:$ L0 M+ D9 f5 v& {* D: N0 e2 z7 \
POST /questions/ HTTP/1.1Host: www.example.com/1 ?8 W8 g P; y8 R
如果创建 URL,指定名称时不得使用 POST 来创建它。这应该导致“找不到资源”错误,因为不存在。你应该 首先将资源放在服务器上。
. b, ?5 |6 F0 }. t: S2 d1 P6 R使用 可执行以下操作POST 创建资源:3 X5 f! w6 I; @8 X; ~* i# r$ L
POST /questions HTTP/1.1Host: www.example.com/
; O* m+ _" l$ D& ?: \请注意,在这种情况下,没有指定资源名称,新对象 URL 路径将返回给您。
4 V6 j* {0 [6 h5 X1 u; y& j8 P5 xPUT:8 [ ^! h8 k! F4 z3 U: c; } l. I g
用于创建或覆盖资源。当您指定资源时,新 URL 时。
; p& H& ?, ~5 e% w: H" f C新资源:# i7 g. _* z" Z6 w% Y$ O. `
PUT /questions/ HTTP/1.1Host: www.example.com/
1 i& t# v; d0 N! S A3 T* V覆盖现有资源:
5 G2 F9 I* E" O& w7 z" GPUT /questions/ HTTP/1.1Host: www.example.com/
% X( [# D; T; E7 U$ X% E另外,更简洁一点,RFC 7231 第 4.3.4 节 PUT状态(添加重点),% w8 x! ?5 N" H) ~7 Z
4.3.4. PUT:# n5 M5 E8 t1 p K$ q# ~
PUT 目标资源的状态是 created或replaced包含在请求消息有效负载中的表示定义状态。 |
|
|
|
|
|