你真的了解POST、GET请求吗?

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请求了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

执迷原理

感谢支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值