请求方法
HTTP 请求方法
本文着眼于讨论 HTTP 中不同请求方法的分别适用的场景。
Get 与 Post
Post 与 Put
注意到,POST 和 PUT 都可用于创建或更新资源,然而,它们之间还是有比较大的区别:POST 所对应的 URI 并非创建的资源本身,而是资源的接收者,资源本身的存放位置由服务器决定;而 PUT 所对应的 URI 是要创建或更新的资源本身,它指明了具体的存放位置。比如,往某个站点添加一篇文章,如果使用 POST 来创建资源,可类似这样:
POST /articles HTTP/1.1
{
"author": "ethan",
"title": "hello world",
"content": "hello world"
}
在上面,POST 对应的 URI 是 /articles,它是资源的接收者,而非资源的标识,如果资源被成功创建,服务器可以返回 201 Created 状态以及新建资源的位置,比如:
HTTP/1.1 201 Created
Location: /articles/abcdef123
我们如果知道新建资源的标识符,可以使用 PUT 来创建资源,比如:
PUT /articles/abcdef234 HTTP/1.1
{
"author": "peter",
"title": "hello world",
"content": "hello world"
}
在上面,PUT 对应的 URI 是 /articles/abcdef234
,它指明了资源的存放位置,如果资源被成功创建,服务器可以返回 201 Created
状态以及新建资源的位置,比如:
HTTP/1.1 201 Created
Location: /articles/abcdef234
- 使用 PUT 更新某一资源,需要更新资源的全部属性;而使用 POST,可以更新全部或一部分值
比如使用 PUT 更新地址为 /articles/abcdef234
的文章的标题,我们需要发送所有值:
PUT /articles/abcdef234 HTTP/1.1
{
"author": "peter",
"title": "hello python",
"content": "hello world"
}
而使用 POST,可以更新某个域的值:
POST /articles/abcdef234 HTTP/1.1
{
"title": "hello python"
}
POST 是不幂等的,PUT 是幂等的,这是一个很重要的区别。HTTP 方法的幂等性是指一次和多次请求某一个资源应该具有同样的副作用,注意这里是副作用,而不是返回结果。总结而言,GET 方法用于获取资源,不会改变资源的状态,不论调用一次还是多次都没有副作用,因此它是幂等的;DELETE 方法用于删除资源,有副作用,但调用一次或多次都是删除同个资源,产生的副作用是相同的,因此也是幂等的;POST 是不幂等的,因为两次相同的 POST 请求会在服务器创建两份资源,它们具有不同的 URI;PUT 是幂等的,对同一 URI 进行多次 PUT 的副作用和一次 PUT 是相同的。