HTTP Method 方法汇总及之间的差异

今天查阅了相关资料,梳理一下有关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的区别

GETPOST
用途GET一般只能用来获取资源POST可以获取,创建,更新资源
后退按钮/刷新无害数据会被重新提交(浏览器应该告知用户数据会被重新提交)。
书签可收藏为书签不可收藏为书签
缓存能被缓存(浏览器主动)不能缓存(除非手动设置)
编码类型application/x-www-form-urlencodedapplication/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(永久移动)响应;
用户代理可以自行决定是否重定向请求。

PUTPOST
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 方法区别

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值