GET和POST的区别
相同点:
- 两者都是基于tcp协议进行传输数据的,都是http协议中的请求方法。
不同点:
-
传输数据方式
-
get传递参数是通过url传递传输。例如 https://www.baidu.com?name=张三&age=12&sex=男,也可以使用https://www.baidu.com/name/张三/age/12/sex/男,是因为解析报文的过程是通过获取
TCP 数据,用正则等工具从数据中获取 Header 和 Body,从而提取参数,只要保证服务端能够正常解析数据即可。 - post传递参数属于隐式传递参数(可以参考后面post传递参数四种格式)。由于各个浏览器或者各种框架技术原因,部分情况下post会发送两次tcp数据包,先发送 header,服务端返回 100 状态码再发送 body。
-
get传递参数是通过url传递传输。例如 https://www.baidu.com?name=张三&age=12&sex=男,也可以使用https://www.baidu.com/name/张三/age/12/sex/男,是因为解析报文的过程是通过获取
-
数据传输大小
- get方式提交数据的大小(一般来说1024字节),http协议并没有硬性限制,而是与浏览器、服务器、操作系统有关(为了性能和安全,服务器解析长url需要消耗较大的性能)。
- post理论上来说没有大小限制,http协议规范也没有进行大小限制,但实际上post所能传递的数据量根据取决于服务器的设置和内存大小。
-
数据安全
- ge传递参数是通过浏览器的地址传递参数,是可以直接查看,安全系数低,因此不建议将一些重要的数据通过url传递。
- post传递参数是通过隐私传递的,用户不是能直接查看,因此安全系统较高。
- 其实两种数据传输方式都是属于明文传输,只不过get请求针对非英文的参数进行了url编码,post请求可以根据开发者的定义进行编码,如果要保证数据在传输过程种的安全性,可以使用https传输协议。
-
请求类型
- get是从服务器获取资源,属于获取型请求方式。
- post是向服务端创建资源,属于创建型请求方式。
-
历史记录
- get的所有请求都会被记录在浏览器的访问记录里面,但可以通过设置浏览器,不记录。
- post的所有请求不会被记录在浏览器的访问记录里面。
-
重复操作
- get请求是可以针对同一个url发送无限制次数的请求,不会对服务器端的数据造成实际的影响,如果后面的请求跟第一次的请求,内容没发生改变,返回的状态码是304(Not Modified)。
- post请求是向服务器端发送创建性请求,因此会对服务器端的数据造成实际的影响,也就是所谓的重复提交。对于需要限制此类的请求,需要做防止重复提交的请求限制。
-
书签操作
- get请求是可以保存书签的。因为浏览器只可以对当前的url保存书签。
-
post请求是不可以保存书签的。
post传递参数的四种格式
post传递数据格式有四种方式,我们可以通过enctype来设置。这里所说的四种格式,是指的数据传输的编码方式。
我们设置编码方式,在Content-type属性中设置即可。例如,设置为application/json的编码格式:
Content-Type: application/json;charset=utf-8
1.application/x-www-form-urlencoded编码方式:
该编码方式是post请求中默认编码方式,不指定编码方式,就默认采用该编码方式。提交的数据按照key1=val1&key2=val2 的方式进行编码, key 和 val 都进行了 URL 转码
。大部分服务端语言都对这种方式有很好的支持。例如 PHP 中,$_POST[‘title’] 可以获取到 title 的值,$_POST[‘sub’] 可以得到 sub 数组。
效果预览
POST http://www.example.com HTTP/1.1 Content-Type: application/x-www-form-urlencoded;charset=utf-8 title=test&sub%5B%5D=1&sub%5B%5D=2&sub%5B%5D=3 `
2.multipart/form-data编码方式:
只需要给表单的 enctype
设置 multipart/form-data。
效果预览
POST http://www.example.com HTTP/1.1 Content-Type:multipart/form-data; boundary=----WebKitFormBoundaryrGKCBY7qhFd3TrwA ------WebKitFormBoundaryrGKCBY7qhFd3TrwA Content-Disposition: form-data; name="text" title ------WebKitFormBoundaryrGKCBY7qhFd3TrwA Content-Disposition: form-data; name="file"; filename="chrome.png" Content-Type: image/png PNG ... content of chrome.png ... ------WebKitFormBoundaryrGKCBY7qhFd3TrwA--
上面提到的这两种 POST 数据的方式,都是浏览器原生支持的,而且现阶段标准中原生 表单也 只支持这两种方式
(通过 元素的 enctype
属性指定,默认为 application/x-www-form-urlencoded
。其实 enctype
还支持 text/plain
,不过用得非常少)。
3.application/json编码方式:
该编码方式是告诉服务器端消息主体是通过json序列化之后的数据格式。json数据格式是一种跨平台、跨语言、支持键值对复制的数据格式的数据序列化方式。除了低版本 IE 之外的各大浏览器都原生支持 JSON.stringify,服务端语言也都有处理 JSON 的函数,使用 JSON 不会遇上什么麻烦。我们只需要给请求头设置如下格式即可:
Content-Type: application/json;
// jquery发送ajax请求示例 $(function(){ //请求参数 var list = { name: 'bruce', age: 12 }; $.ajax({ //请求方式 type : "POST", //请求的媒体类型 contentType: "application/json;charset=UTF-8", //请求地址 url : "http://127.0.0.1/admin/list/", //数据,json字符串 data : JSON.stringify(list), //请求成功 success : function(result) { console.log(result); }, //请求失败,包含具体的错误信息 error : function(e){ console.log(e.status); console.log(e.responseText); } }); });
效果预览
POST http://www.example.com HTTP/1.1 Content-Type: application/json;charset=utf-8 {"name":"bruce","age":"12"}
4.text/xml编码方式:
xml是一种可读性高,但臃肿并传输传输量大的一种数据格式。设置格式如下:
Content-Type: application/json;
效果预览
POST http://www.example.com HTTP/1.1 Content-Type: text/xml examples.getStateName 41
get数据传输格式
get请求中,虽然传递的参数是明文传输,但也是进行了部分编码处理的,并且只有一种格式, application/x-www-form-urlencoding
。如下格式:
数据串联在url后面作为参数—->浏览器会对url中英文字母以外的字符进行URL encode(此时的编码方式因浏览器而定)—->发送给服务器时最终用iso-8859-1编码成二进制0,1来传输—->服务器对数据用iso-8859-1解码。
经常遇到中文乱码的原因也就在于第二步那里,我们并不知道浏览器的用哪种编码方式对字符进行了编码,而我们常见的解决方案就是把参数中文部分URLencode后再拼接到url后面,而编码方式一般设置为utf-8.