### 1.3 何时使用 POST 方法
本节简要介绍POST 的不同应用场合。
#### 问题描述
您想知道POST 方法的潜在应用场合。
#### 解决方案
在以下场合中使用POST 方法:
创建新的资源,把资源作为一个工厂,详见 1.4 节。
通过一个控制器资源来修改一个或多个资源。
执行需要大数据输入的查询,详见 5.3 节。
在其他HTTP 方法看上去不合适时,执行不安全或非幂等的操作。
#### 问题讨论
在 HTTP 协议中,POST 方法的语义是最通用的,HTTP 规范定义这个方法可以应用于以下场合:
对已存在资源做评论或注解。
向公告板、新闻组、邮件列表或类似的文章群组发送消息。
提供数据块,例如,作为表单提交到数据处理器处理后的结果。
通过追加操作扩充数据库。
所有这些操作都是不安全和非幂等的,所有基于HTTP 的工具都会这样对待POST,例如:
缓存不会缓存这一方法的响应。
网络爬虫和类似的工具不会自动发起POST 请求。
大部分通用的HTTP 工具不会自动重复提交POST 请求。
这些处理方式给服务器留下了巨大的空间,将POST作为针对多种操作的一个通用方法,包括 穿隧(tunneling)注2,考虑以下例子:
~~~
# 一条穿隧了HTTP POST的XML RPC消息
POST /RPC2 HTTP/1.1
Host: www.example.org
Content-Type: text/xml;charset=UTF-8
<methodName>messages.delete</methodName>
<params>
<param>
<value><int>1234</int></value>
</param>
</params>
</methodCall>
~~~
这是一个XML-RPC(`http://www.xmlrpc.com/`)通过POST方法穿隧操作的例子。另一个知名的例子是HTTP上的SOAP:
~~~
# 一条穿隧了HTTP POST的SOAP消息
POST /Messages HTTP/1.1 Host: www.example.org
Content-Type: application/soap+xml; charset=UTF-8
<soap:Envelope xmlns:soap="http://www.w3.org/2001/12/soap-envelope" soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding">
<soap:Body xmlns:ns="http://www.example.org/messages">
<ns:DeleteMessage>
<ns:MessageId>1234</ns:MessageId>
</ns:DeleteMessage>
</soap:Body>
</soap:Envelope>
~~~
这两个例子都是对POST 方法的误用。例如,DELETE 方法在此更为适用:
~~~
# 使用 DELETE
DELETE /message/1234 HTTP/1.1
Host: www.example.org
~~~
另外,以下情况必须使用POST,即使 GET 才是正确的方法:
* 浏览器等HTML 客户端在发起请求获取相关资源时,将页面的 URI 作为Referer 头。这可能会把包含在URI 中的敏感信息泄露给外部服务器。这种情况下,使用传输层安全协议(Transport Layer Security,TLS,SSL 的接班人),或者,如果不能加密URI 中的敏感信息,考虑使用POST 处理HTML 文档。
* 正如将在5.3 节讨论的,当客户端提交的查询包含太多参数时,POST 可能是唯一的选择。但即使是以上情况,POST 也应当是最后的选择。
- 《Restful Web Service Cookbook》
- 简介
- 推荐序
- 第 1 章 使用统一接口
- 1.1 如何保持交互的可见性
- 1.2 何时使用 GET 方法
- 1.3 何时使用 POST 方法
- 1.4 如何使用 POST 方法创建资源
- 目录
- PHP RESTful
- 理解RESTful架构
- 深入浅出REST
- 表述性状态转移
- 无状态
- 设计指南
- RESTful API 设计指南
- RESTful API 设计最佳实践
- 测试工具
- soapUI
- 实例
- 豆瓣
- 应用
- 接口规范
- 视频
- 《Restful API实战》
- 课程目标
- 第1章 Restful是什么
- 1-1 restful简介及资源介绍
- 第2章 为什么要使用Restful
- 2-1 Restful中HTTP协议介绍
- 2-2 架构区别
- 第3章 如何使用Restful
- 3-1 restful设计要素
- 3-2 DHC Client
- 3-3 本地开发环境搭建
- 3-4 确认设计要素
- 3-5 数据库设计
- 3-6 用户业务逻辑
- 3-7 文章业务逻辑
- 3-8 restfulApi设计要素
- 3-9 初始化运行参数
- 3-10 完善用户API
- 3-11 完善文章API
- 文摘
- RESTful 接口实现简明指南
- RESTful Web 服务教程
- 模型表示(Representations)
- 资源定位
- URI中的查询参数
- 统一接口
- PUT 和 POST 的区别
- 基于 REST 的 Web 服务
- PHP Reatful
- Restful状态响应码
- 《REST API 安全设计指南》