GET和POST的区别

Get和Post的区别

解题思路:这道题已经属于不能再考的题目了,遇到这道题目。我们不能简单的解答,get如何,post如何。我们需要从两者的不同点、相同点、数据的传输方式、底层分析。

相同点:

  • 两者都是基于tcp协议进行传输数据的,都是http协议中的请求方法。

不同点:

  • 传输数据方式
  • 数据传输大小
    • 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的编码格式:

1
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 数组。
效果预览

1
2
3
4
5
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。

1
2
3
4
5
6
<form action="" enctype="multipart/form-data" method="post">
用户名称: <input type="text" name="username">
用户密码: <input type="password" name="password">
文件选择: <input type="file" name="file">
<input type="submit">
</form>

效果预览

1
2
3
4
5
6
7
8
9
10
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 不会遇上什么麻烦。我们只需要给请求头设置如下格式即可:

1
Content-Type: application/json;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
// 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);
}
});
});

效果预览

1
2
3
POST http://www.example.com HTTP/1.1
Content-Type: application/json;charset=utf-8
{"name":"bruce","age":"12"}

4.text/xml编码方式:
xml是一种可读性高,但臃肿并传输传输量大的一种数据格式。设置格式如下:

1
Content-Type: application/json;

效果预览

1
2
3
4
5
6
7
8
9
10
11
POST http://www.example.com HTTP/1.1
Content-Type: text/xml
<?xml version="1.0"?>
<methodCall>
<methodName>examples.getStateName</methodName>
<params>
<param>
<value><i4>41</i4></value>
</param>
</params>
</methodCall>

get数据传输格式

get请求中,虽然传递的参数是明文传输,但也是进行了部分编码处理的,并且只有一种格式,application/x-www-form-urlencoding。如下格式:
数据串联在url后面作为参数—->浏览器会对url中英文字母以外的字符进行URL encode(此时的编码方式因浏览器而定)—->发送给服务器时最终用iso-8859-1编码成二进制0,1来传输—->服务器对数据用iso-8859-1解码。

经常遇到中文乱码的原因也就在于第二步那里,我们并不知道浏览器的用哪种编码方式对字符进行了编码,而我们常见的解决方案就是把参数中文部分URLencode后再拼接到url后面,而编码方式一般设置为utf-8.