1.介绍GET请求
1.1GET请求被用来做什么?
GET字面意思为获取,顾名思义它被用来从哪里获取信息(服务器对应的有数据反馈),当然了,它也可以用来提交什么信息,只是提交信息一般我们用POST请求来代替
1.2GET请求怎么获取想要的内容?
我们都知道,我们发送一个请求,服务器会根据我们发送的请求做处理之后返回给我们想要的东西(http协议中的报文),但是我们肯定要先明确告诉我们需要什么东西,人家才知道给我们要返回什么东西合适嘛,对叭,那这个时候我们就要明白对于GET请求而言,我们需要把我们明确想要的东西放在什么位置,之后服务器就可以清楚的知道该返回给我们什么东西。那么针对GET请求而言,我们把明确想要的东西呢,放在URL地址中,利用 ?连接,若有多个我们想要的东西,那么用 & 连接。下面我们就做一个简单的例子,假如我们需要知道苹果的价格以及它成没成熟,通过GET请求,之后服务器反馈给我们苹果的消息。
服务器端代码(NodeJS书写)
import express from 'express';
const app = express();
let port = 7000;
let ip = '127.0.0.1'
let appleObj = {
name : 'apple',
price : 3000 ,
mature : true
}
app.get('/fruit',(req,res) => {
const url = req.url; // 获取请求地址
const method = req.method; // 获取请求方式
console.log(url,method);
console.log(req.query); // 获取请求的信息,也就是我们想要的东西
let param = req.query
res.setHeader('Access-Control-Allow-Origin','*');
if(param.name === 'apple'){
res.send(appleObj);
}else{
res.send('nothing');
}
})
app.listen(port,() => {
console.log(`your sever is running at http://${ip}:${port}`)
})
客户端代码
let btn = document.querySelector('button');
btn.addEventListener('click',() => {
let xhr = new XMLHttpRequest();
xhr.onload = function(){
if(xhr.status === 200 || xhr.status < 300){
console.log(JSON.parse(xhr.responseText));
}else{
console.log('error request');
}
}
let url = addURLParam('http://127.0.0.1:7000/fruit',"name","apple")
xhr.open('GET',url,true); // 我们需要知道苹果的信息,我们利用open()方法中的url地址来向服务器端表述
xhr.send(null);
})
// 进行准确编码URL
function addURLParam(url,name,value){
url += (url.indexOf("?") == -1 ? "?" : "&");
url += encodeURIComponent(name) + "=" + encodeURIComponent(value);
return url
}
注意: 发送GET请求最常见的一个错误是查询字符串格式的不对。查询字符串中的每一个名和值都必须使用encodeURLComponent()编码,所有名/值对必须以 & 分隔
1.3GET请求表述的内容有多大呢?
我们的GET请求表述的内容是有大小限制的,我们需要注意的是,我们不能表述无穷个我们需要的东西,这是GET请求的一个限制,但也不能说是GET请求的限制,HTTP 协议没有 Body 和 URL 的长度限制,对 URL 限制的大多是浏览器和服务器的原因。浏览器原因就不说了,服务器是因为处理长 URL 要消耗比较多的资源,为了性能和安全(防止恶意构造长 URL 来攻击)考虑,会给 URL 长度加限制。多大的话,我自己也没尝试过,可能生平都不会用到那么大的内容请求叭(w3school 里面说 URL 的最大长度是 2048 个字符)。
1.4GET请求安全吗?
这个我觉得显而易见了,GET请求肯定不安全了,你想啊,你把账号密码放到url地址上,那只要眼睛不瞎的一眼就能看出来叭,所以GET请求肯定是不安全滴,这也说明私密性的东西不要用GET请求去传输。
1.5GET请求对数据类型有要求吗?
GET请求只认ASCII字符(它包含了大小写英语字母、美式英语标点符号、10进制数字,以及一些控制代码),别的字符它老人家一律不认,来了就是不知道!
1.6GET请求会被缓存吗?
首先明确下GET请求会被缓存,当我们请求苹果信息时给上缓存,我们再一次点击获取苹果信息时,缓存就会启动,过了缓存时间,就不会被继续缓存,但是可以实现缓存机制,也就是说GET请求是可以被缓存的,HTTP缓存的基本目的就是使应用执行的更快,更易扩展,但是HTTP缓存通常只适用于idempotent request(可以理解为查询请求,也就是不更新服务端数据的请求),这也就导致了在HTTP的世界里,一般都是对Get请求做缓存。
2.介绍POST请求
2.1POST请求被用来做什么?
POST字面意思为提交,顾名思义它被用来提交信息(服务器不需要有数据反馈),当然了,它也可以用来获取什么信息,但获取信息一般用GET请求。
2.2POST请求将提交内容放在哪儿?
我们知道了GET请求的数据放在URL中,但是POST请求不是放在URL中,它将数据放在更为隐秘的地方——请求体里面(不会暴露再URL中)。
2.3POST请求的有内容大小限制吗?
POST请求是没有限制的,其实GET请求大小也是没有限制的,再一次提醒一遍,GET请求的限制来源于浏览器或者服务器对URL长度的限制。而POST请求的数据不放在URL中,所以就没有大小限制。
2.4POST请求安全吗?
因为POST请求的数据不放在URL中,而是放在更为隐秘的请求体里面,所以,相对于GET请求来说,POST请求更为靠谱、安全,平常时的私密内容还是靠POST请求去完成比较理想。
2.5POST请求对数据类型有要求吗?
POST请求对数据类型是没有任何要求的,理想的状态它都有,它允许二进制数据。
2.6POST请求会被缓存吗?
POST请求不会被缓存,因为参数不会被保存在浏览器历史或 web 服务器日志中,这也是为什么它比GET请求更加安全的原因(所以它不能被存书签、回退刷新会重新提交数据等),反正它绝对是不允许被缓存的。
3.总结
GET请求 | POST请求 |
---|---|
一般用来获取数据 | 一般用来提交数据 |
不够安全,数据暴露再URL中 | 安全,数据放在更为隐秘的请求体里面 |
因为数据放在URL中,所以有大小限制,最大为2048个字符 | 没有大小限制 |
对数据类型有要求,只允许ASCII字符 | 对数据类型没有限制,允许二进制 |
可以被缓存 | 不可以被缓存 |
因为可以被缓存,所以可以刷新、回退都没有害处,而且可以加入书签 | 因为不能被缓存,则面对刷新、回退都会重新提交数据,并且不能够被加入书签 |
注意:
GET请求和POST请求其实是没什么区别的,可以混用,但是因为有些极端要求,所以最好是分开使用,比如提交照片大型文件、提交密码这类隐式内容,那最好还是用POST请求,但是GET请求因为能够被缓存,相对来说性能会有优势,所以在某些不出于安全考虑并且数据比较少的情况,我们就可以放心大胆的用GET请求了