HTTP 常见请求方法

1.1. GET

最常用的方法,它是发送一个请求来获取服务器上的资源,资源通过 HTTP 响应头和数据(如 html 文档,图片,样式,视频等)返回给客户端(如浏览器)。

GET 请求可以在 URL 中附带查询参数,如 test.php?id=1。

  • GET 请求可被缓存
  • GET 请求保留在浏览器历史记录中
  • GET 请求可被收藏为书签
  • GET 请求不应在处理敏感数据时使用;
  • GET 请求有长度限制,不同浏览器的长度限制不同;
  • GET 请求只应当用于取回数据;
  • 在浏览器地址栏中输入网址访问资源都是通过 GET 方式发送 HTTP 请求;
  • 表单的 methods 属性为 get;

1.2. POST

用于向服务器提交数据,请求的参数要在请求体(body)中发送,可用于表单的提交和异步提交(如ajax),理论上,POST 传递的数据量没有限制。

  • POST 请求不会被缓存
  • POST 请求不会保留在浏览器历史记录中
  • POST 请求不能被收藏为书签
  • POST 请求对数据长度没有要求

由于 HTTP 协议只规定 POST 提交的数据必须放在消息主体(body)中,并没有规定数据必须使用什么编码方式。前后端交互时编码和解码就变的棘手,服务端通常是根据请求头中的 Content-Type 字段来获知请求中的消息主体是用何种方式编码,再对 body 进行解析。

1.2.1. POST请求常用的编码方式

  • application/x-www-form-urlencoded:数据在发送到服务器之前,会将表单内的数据转换为键值对。比如,username=admin&password=123456,并将所有字符都会进行 URL 转码。

  • multipart/form-data:数据将被编码为一条消息,以标签为单元,用分隔符分开,既可以上传键值对,也可以上传文件,通常用于上传二进制的文件。

  • application/json:用来告诉服务端消息主体是序列化后的 JSON 字符串,前端无法将表单的 enctype 属性指定为 application/json,通常使用 ajax 的方式发送这种编码形式的请求。

    具体使用何种编码方式,需要前后端进行约定,目前比较常见的是文件上传时使用 multipart/form-data,其他默认使用 application/json 编码方式

    post 方法提交数据,必须指定 Content-Type 头,如果不指定,浏览器会添加默认的 Content-Type 头。

1.3. PUT

与 POST 方法类似,在 RESTful 设计规范中,一般 POST 方法代表新增,PUT 方法代表整体更新,选择什么方法主要看接口的要求,PUT 请求的参数一样要在 HTTP 请求的消息主体中发送,默认情况下 PUT 请求是无法提交表单数据的。

1.4. PATCH

与 PUT 方法类似,但 PATCH 方法通常应用于局部更新

1.5. DELETE

删除某一个资源,默认情况下 DELETE 方法在 URL 中附带查询参数,也无法提交表单数据的。

1.6. 其他方法

HTTP1.0 定义了三种请求方法: GET,POST 和 HEAD 方法。

HTTP1.1 新增了六种请求方法:OPTIONS、PUT、PATCH、DELETE、TRACE 和 CONNECT 方法。

序号 方法 描述
1 GET 请求指定的页面信息,并返回实体主体。
2 HEAD 类似于 GET 请求,只不过返回的响应中没有具体的内容,用于获取报头
3 POST 向指定资源提交数据进行处理请求
4 PUT HTTP1.1 从客户端向服务器传送的数据取代指定的文档的内容。
5 DELETE HTTP1.1 请求服务器删除指定的页面。
6 CONNECT HTTP1.1 协议中预留给能够将连接改为管道方式的代理服务器。
7 OPTIONS HTTP1.1 允许客户端查看服务器的性能。
8 TRACE HTTP1.1 回显服务器收到的请求,主要用于测试或诊断。
9 PATCH HTTP1.1 是对 PUT 方法的补充,用来对已知资源进行局部更新 。

1.7 GET 和 POST 的区别

(1)GET 参数通过 url 传递,POST 放在 request body 中。

(2)GET 请求在 url 中传递的参数是有长度限制的,而 post 没有。

(3)GET 比 POST 更不安全,因为参数直接暴露在 url 中,所以不能用来传递敏感信息;POST 不会作为 url 的一部分,不会被缓存,保存在服务器日志以及在浏览器浏览记录中。

(4)GET 请求只能进行 url 编码,而 POST 支持多种编码方式。

(5)GET 请求会浏览器主动缓存。

(6)GET 请求参数会被完整保留在浏览历史记录里,而 post 中的参数不会被保留。

(7)GET 和 POST 本质上就是 TCP 链接,并无差别。但是由于 HTTP 的规定和浏览器/服务器的限制,导致他们在应用过程中体现出一些不同。GET 产生一个 TCP 数据包;POST 产生两个 TCP 数据包。浏览器先发送 header,服务器响应 100 continue,浏览器再发送 data,服务器响应 200 ok(返回数据)。

1.8 GET 请求传参长度的误区

误区:经常说 GET 请求参数的大小存在限制,而 POST 请求的参数大小是无限制的。

实际上 HTTP 协议从未规定 GET/POST 的请求长度限制是多少。对 GET 请求参数的限制是来源于浏览器或web 服务器,浏览器或 web 服务器限制了 url 的长度。为了明确这个概念,必须再强调下面几点:

  • HTTP 协议未规定 GET 和 POST 的长度限制;

  • GET 的最大长度显示是因为浏览器和 web 服务器限制了 URL 的长度;

  • 不同的浏览器和 Web 服务器,限制的最大长度不一样;

  • 要支持 IE,则最大长度为 2083 byte,若只支持 Chrome,则最大长度 8182 byte;

1.9 GET 和 POST 在缓存方面的区别

GET 请求类似于查找的过程,用户获取数据,可以不用每次都与数据库连接,所以可以使用缓存;

POST 不同,POST 做的一般是修改和删除的工作,所以必须与数据库交互,所以不能使用缓存。因此,GET 请求适合于做请求缓存。