解题思路:这道题已经属于不能再考的题目了,遇到这道题目。我们不能简单的解答,get如何,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.1Content-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。
<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>
效果预览
POST http://www.example.com HTTP/1.1Content-Type:multipart/form-data; boundary=----WebKitFormBoundaryrGKCBY7qhFd3TrwA------WebKitFormBoundaryrGKCBY7qhFd3TrwAContent-Disposition: form-data; name="text"title------WebKitFormBoundaryrGKCBY7qhFd3TrwAContent-Disposition: form-data; name="file"; filename="chrome.png"Content-Type: image/pngPNG ... 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.1Content-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.1Content-Type: text/xml<?xml version="1.0"?><methodCall><methodName>examples.getStateName</methodName><params><param><value><i4>41</i4></value></param></params></methodCall>
get请求中,虽然传递的参数是明文传输,但也是进行了部分编码处理的,并且只有一种格式, application/x-www-form-urlencoding
。如下格式: 数据串联在url后面作为参数---->浏览器会对url中英文字母以外的字符进行URL encode(此时的编码方式因浏览器而定)---->发送给服务器时最终用iso-8859-1编码成二进制0,1来传输---->服务器对数据用iso-8859-1解码。
经常遇到中文乱码的原因也就在于第二步那里,我们并不知道浏览器的用哪种编码方式对字符进行了编码,而我们常见的解决方案就是把参数中文部分URLencode后再拼接到url后面,而编码方式一般设置为utf-8.