GET和POST是HTTP(超文本传输协议)最常用的两种方法 HTTP的设计目的为了保证客户机与服务器之间的通信 HTTP的工作方式是客户机和服务器之间的请求-应答协议 GET-从指定资源请求数据 POST-从指定的资源提交要被处理的数据
GET方法
查询字符串(名称/值对)是在GET请求的URL中发送的:/test/demo_form.asp?name1=value1&name2=value2 有关GET请求的其他一些注释 GET请求可被缓存
GET请求保留在浏览器历史纪录中 GET请求可被收藏为书签 GET请求不应在处理敏感数据时使用 GET请求有长度限制 GET请求只应用于取回数据
POST方法
查询字符串(名称/值)是在POST请求的HTTP消息主体中发送的POST /test/demo_form.asp HTTP/1.1 Host: w3schools.com name1=value1&name2=value2 有关POST请求的其他一些注释
POST请求不会被缓存POST请求不会保留在浏览器历史纪录中POST请求不能被收藏为书签
GET和POST对比
GET、POST 请求报文上的区别
GET 和 POST 只是 HTTP 协议中两种请求方式(异曲同工),而 HTTP 协议是基于 TCP/IP 的应用层协议,无论 GET 还是 POST,用的都是同一个传输层协议,所以在传输上,没有区别。
报文格式上,不带参数时,最大区别就是第一行方法名不同, 仅仅是报文的几个字符不同而已,POST 方法请求报文第一行是这样的 POST /url HTTP/1.1 GET 方法请求报文第一行是这样的 GET /url HTTP/1.1
GET方法报文 GET /updateInfo?name=Javanx&age=25 HTTP/1.1 Host: localhost
POST方法报文 POST /updateInfo HTTP/1.1 Host: localhost Content-Type: application/x-www-form-urlencoded name=Javanx&age=25
现在我们知道了两种方法本质上是 TCP 连接,没有区别。但如果不按规范来也是可以的,可以在 URL 上写参数,然后方法使用 POST;也可以在 Body 写参数,然后方法使用 GET。当然,这需要服务端支持
GET方法参数的写法 在约定中,我们的参数是写在?后面,用&分割。解析报文的过程是通过获取TCP数据,用正则等工具从数据中获取Header和Body,从而提取参数。
GET方法的长度限制 首先声明,HTTP协议没有Body和URL的长度限制,对URL限制大多是浏览器和服务器的原因,服务器因为要处理长URL要消耗较多的资源,为了性能和安全(防止恶意构造长URL来攻击)考虑,会给URL长度加限制。 规定:get传送的数据量较小,不能大于2KB。post传送的数据量较大,一般被默认为不受限制。但理论上,IIS4中最大量为80KB,IIS5中为100KB。
GET和POST安全性 有人说POST比GET安全,因为数据在地址栏上不可见。 但是从传输的角度讲,他们都是不安全的,因为HTTP在网络上是明文传输的,只要在网络节点上抓包,就能完整地获取数据报文。 要想安全传输,就只有加密,也就是HTTPS
POST方法会产生两个TCP数据包吗? 有些文章中提到,post 会将 header 和 body 分开发送,先发送 header,服务端返回 100 状态码再发送 body。
HTTP 协议中没有明确说明 POST 会产生两个 TCP 数据包,而且实际测试(Chrome)发现,header 和 body 不会分开发送。
所以,header 和 body 分开发送是部分浏览器或框架的请求方法,不属于 post 必然行为。
客户端发送一个HTTP请求到服务器的请求消息包括以下格式
HTTP请求中请求头 Header里的 Content-Type
Content-Type一般有这三种。 application/x-www-form-urlencoded :数据被编码为名称/值对。这是标准的编码格式。 multipart/form-data : 数据被编码为一条消息,页上的每个控件对应消息中的一个部分。 text/plain :数据以纯文本形式(text/json/xml/html)进行编码,其中不含任何控件或格式字符。postman软件里标的是RAW。
form表单的enctype属性为编码方式,常见的有两种:application/x-www-form-urlencoded、multipart/form-data。默认值是application/x-www-form-urlencoded。 当请求方式为get时浏览器会用application/x-www-form-urlencoded的编码方式把form数据转换成一个字符串,用 ? 连接url将数据追加到url的后边。生成新的url。
当请求方式为post浏览器会将form数据分装到http body中,如果没有type=file的控件的话,浏览器会使用默认的编码方式application/x-www-form-urlencoded进行编码,如果有type=file控件的话,将会使用multipart/form-data的编码方式进行编码。
当action为post且Content-Type类型是multipart/form-data,浏览器会把整个表单以控件为单位分割,并为每个部分加上Content-Disposition(form-data或者file),Content-Type(默认为text/plain),name(控件name)等信息,并加上分割符(boundary)。