今天查阅了相关资料,梳理一下有关http的方法,也是从事API 测试必须掌握的基础知识。
什么是HTTP
HTTP是Hypertext Transfer Protocol,用于客户端和服务器端通讯的协议。HTTP充当客户端和服务器端之间的请求应答协议,客户端发出请求,服务端做出响应。
HTTP 方法
HTTP协议定义了一些不同类型的请求用于客户端发给服务器端,也称为请求方法,有GET, POST, PUT, DELETE, HEAD, PATCH, OPTIONS等。
GET方法:
Transfer a current representation of the target resource
请求服务器端已经存在的资源,通常将Query String查询条件以键值对的编码形式追加到URL中。
POST方法:
Perform resource-specific processing on the request payload
POST用于用户创建,获取,或更新服务器上的资源,通过 POST 发送到服务器的数据存储在 HTTP 请求的请求主体中。
PUT方法:
Replace all current representations of the target resource with the request payload.
PUT 用于将数据发送到服务器来创建/更新资源。
POST 和 PUT之间的区别
在于 PUT 请求是幂等的(idempotent)。也就是说,多次调用相同的 PUT 请求将始终产生相同的结果。相反,重复调用POST请求具有多次创建相同资源的副作用。
HEAD方法:
Same as GET, but only transfer the status line and header section.
HEAD 与 GET 几乎相同,但没有响应主体,只返回响应头部信息。HEAD 请求对于在实际发出 GET 请求之前(例如在下载大文件或响应正文之前)检查 GET 请求将返回的内容很有用。
DELETE方法:
Remove all current representations of the target resource.
用于删除服务器端指定的资源,指定资源的设定追加在URL中。
OPTIONS方法:
Describe the communication options for the target resource.
描述目标资源所支持的http方法选项。
PATCH方法:
用来更新服务器端已经存在资源的局部属性。
方法的等幂性和安全性:
Question #1: GET/DELETE方法是否支持Request Body
由于URL字符数受限于2048个长度内,如果需要发大量的query string将无法实现。
根据 RFC 7231 GET/DELETE是支持Request body的,但是会有一些隐患。下面引用一段GET中的说明:
GET is the primary mechanism of information retrieval and the focus of almost all
performance optimizations
.
A payload within a GET request message
has no defined semantics; sending a payload body on a GET request might cause some existing implementations to reject the request.
那么有哪些隐患呢?
隐患1:各大framework,tool的支持情况:
GET support
Body in .NET Core
GET doesn’t support
Body in .NET Framework
Using Fiddler – Warning
for GET
SOAP UI – No support
PostMan UI- Support
(The recent version)
Using Swagger – No support
隐患2:服务器配置问题
有些服务器缓存GET和HEAD的响应,这种行为可能有问题
有些服务器忽略GET中Request中的body
隐患3:代理可能会中断带Body的请求
隐患4:其它原因:
Amazon CloudFront doesn’t support
GET with Body parameter.
Sping-framework doesn’t support
GET with the body.
XMLHttpRequest doesn’t support
GET with the body.
Most Javascript libraries don’t support
GET with a body.
Elastic search support
GET with body parameter. (This is the only example, I found in the support.)
Question #2: GET和POST的区别
GET | POST | |
---|---|---|
用途 | GET一般只能用来获取资源 | POST可以获取,创建,更新资源 |
后退按钮/刷新 | 无害 | 数据会被重新提交(浏览器应该告知用户数据会被重新提交)。 |
书签 | 可收藏为书签 | 不可收藏为书签 |
缓存 | 能被缓存(浏览器主动) | 不能缓存(除非手动设置) |
编码类型 | application/x-www-form-urlencoded | application/x-www-form-urlencoded 或 multipart/form-data。为二进制数据使用多重编码。 |
历史 | 参数保留在浏览器历史中。 | 参数不会保存在浏览器历史中。 |
对数据长度的限制 | 是的。当发送数据时,GET 方法向 URL 添加数据;URL 的长度是受限制的(URL 的最大长度是 2048 个字符)。 | 无限制。 |
对数据类型的限制 | 只允许 ASCII 字符。 | 没有限制。也允许二进制数据(images or word documents )。 |
安全性 | 与 POST 相比,GET 的安全性较差,因为所发送的数据是 URL 的一部分。在发送密码或其他敏感信息时绝不要使用 GET ! | POST 比 GET 更安全,因为参数不会被保存在浏览器历史或 web 服务器日志中。 |
可见性 | 数据在 URL 中对所有人都是可见的。 | 数据不会显示在 URL 中。 |
性能 | GET性能更佳,Query String追加在URL中,这种方式直接简单 | 获取资源POST相对差一点,需要耗时解析Request Body |
TCP数据包 | 对于GET方式的请求,产生一个TCP数据包,浏览器会把http header和data一并发送出去,服务器响应200(返回数据) | 而对于POST,产生两个TCP数据包, 浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)但并不是所有浏览器都会在POST中发送两次包,Firefox就只发送一次。 |
Question #3: POST 和 PUT的区别
RFC 2616 本身解释了核心差异:
POST和PUT请求之间的
根本区别
反映在Request-URI的不同含义中。POST请求中的URI标识将处理封闭实体的资源。该资源可能是数据接受过程,某个其他协议的入口,也可能是接受注释的单独实体。相比之下,PUT请求中的URI标识了请求中包含的实体,用户代理知道哪个URI是预期的,服务器不能尝试将请求应用到其他资源。如果服务器希望请求被应用到不同的URI,它必须发送301(永久移动)响应;
用户代理可以自行决定是否重定向请求。
PUT | POST |
---|---|
PUT方法是等幂操作 | POST方法不是等幂操作 |
更改某一单个资源(已经存在于某一资源集合中)时调用. | 增加某一子资源从属于某资源集合 |
创建时PUT需要指定资源的id | 而POST不需要指定被创建资源的id |
更新时要指定被更新资源的id | 要指定被更新资源的id |
请求服务器去把请求里的实体存储在请求URI(Request-URI)标识下 | 方法被用于请求源服务器接受请求中的实体作为请求资源的一个新的从属物 |
PUT 方法语法是 PUT /questions/{question-id} | POST 方法是 POST /questions |
PUT 方法响应不能被缓存 | POST方法可以手动设置缓存(只要服务器设置适当的Cache-Control和Expires头) |
PUT /vi/juice/orders/1234 表明更新标识符为1234的资源 | POST /vi/juice/orders 表明创建一个新的资源从属于orders这个资源集合 |
发送多次PUT请求,结果返回保持一样的 | 发送多次POST请求,将收到不一样的返回结果 |
PUT将对一个特定的资源起作用 | POST将对一个抽象的资源集合起作用 |
通常更新用PUT. | 通常创建用POST. |
PUT方法是客户端决定设置在URL中需要操作的资源对象 | POST 方法是服务器决定所需操作的资源 |
参考:
HTML 请求方法
GET vs POST: Key Difference between HTTP Methods
HTTP GET AND POST METHODS IN HTTP PROTOCOL
HTTP GET with Request body – Guidelines
PUT vs POST: What’s the Difference?
POST 和 PUT 方法区别