首先说一下HTTP请求的两种基本方法,我们都知道是POST和GET
当我们被问到这两者有什么区别时,会毫不犹豫地说出get是地址栏URL提交数据,数据不安全,post是放在请求体RequestBody中提交数据,数据安全
但是随着我们不断地学习,也慢慢发现了另一些区别:
1、GET在浏览器回退时是无害的,而POST会再次提交请求。
2、GET产生的URL地址可以被标为书签Bookmark,而POST不可以。
3、GET请求会被浏览器主动缓存,而POST不会,除非手动设置。
4、GET请求只能进行url编码,而POST支持多种编码方式。
5、GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留。
6、GET请求在URL中传送的参数是有长度限制的,而POST没有。
7、对参数的数据类型,GET只接受ASCII字符,而POST没有限制。
8、GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息。
但是这些区别终归还是由于get是地址栏提交,post是请求体提交。
那GET和POST是什么?
HTTP协议中的两种发送请求的方法。
打破砂锅问到底
那HTTP是什么?
HTTP是基于TCP/IP的关于数据如何在万维网中如何通信的协议。TCP相当于有了交通规则中允许上路的运输工具,IP相当于路线
(HTTP其他协议:HEAD、PUT、DELETE、OPTIONS、CONNECT)
HTTP的底层是TCP/IP。所以GET和POST的底层也是TCP/IP,也就是说,GET/POST都是TCP链接。
GET和POST能做的事情是一样一样的。你要给GET加上request body,给POST带上url参数,技术上是完全行的通的。
但如果是这样的话HTTP协议制定的这些规则又有何种作用呢,其实在很多浏览器当中,地址栏提交数据只能限制2K,有的浏览器虽然可以解析64K的url,但是这些区别终归还是由于get是地址栏提交,post是请求体提交。
再长一些就不会解析了,有人会问,那我们直接用post不就好了,那更加本质的区别就来了:
1、对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据),过程中产生一个TCP数据包。
2、而对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据),过程中产生两个TCP数据包。
GET只需要汽车跑一趟就把货送到了,而POST得跑两趟,第一趟,先去和服务器打个招呼“你等会,我回去送货过来”,然后再回头把货送过去。
网络好的时候,时间上是无差的,但网络不好的时候,POST可以保证TCP包数据的完整性
所以两者都不可以被对方取缔,GET与POST都有自己的语义,不能随便混用。
接下来就是更进一步的问题,那我们为什么要使用JSON传输?
在HTTP请求与响应当中,需要的就是易解析,响应快。
而JSON 是一种轻量级的数据交换格式。它是基于javascript语法标准的一个子集。JSON采用完全独立于语言的文本 格式,可以很容易在各种网络、平台和程序之间传输。JSON的语法很简单,易于人阅读和编写,同时也易于机器解析和生成。
说白了就是我的货物装箱方式易装易卸,我装的还快,你行的话你也可以开发一种更轻量级更易解析的数据格式。
说到了JSON传输,那就涉及后台接收数据与响应了。
@RequestMapping:
作用:使用灵活的方法将web的请求路径映射在一个类上或者一个方法上。
你有路线IP,你知道我在哪个屯儿的,你来找我也得费些时间,但如果我在给你我的门牌号,你直接就送我家了
一般映射在类上,在方法上主要使用他的变体的四个注解,@GetMapping @PostMapping @PutMapping,@DeleteMapping
以便更好的区别不同的请求类型
@RequestBody注解
作用:就是将前端的对象映射成后端的一个对象。比如:前端传递一个User对象,使用这个注解,后端的相应的方法就可以使用user对象来接受这个参数。
也就是JSON解析对象格式,我后端用JSON不方便,我转成我好用的格式。
@ResponseBody:
作用:就是将服务器响应的结果以json数据集的格式返回给客户端。也就是将方法的返回值绑定到web的响应体中。
你前端要JSON我就给你转JSON,然后返回给你。
@RequestParm注解
作用:确定前后端参数名称的映射关系,也就是将前端和后端的参数对应起来。
前端传过来的数据,我怕你不好认,我给我头上贴上名字,你总不至于不认识了吧
@PathVariable注解
作用:通过url来向后端传递参数。主要用于rest风格,比如要获取一个用户编号为1,姓名为chen的用户,就可输入/get/1/chen 来查询
@PathVariable注解就是将URL中的相应参数映射到方法中的参数中去。
可以理解为,你往地上写上标识,这里是张三,那里是李四,张三站到标张三的地方,李四站到标李四的地方。
@RestController
在Spring中@RestController的作用等同于@Controller + @ResponseBody。
get和post请求区别详见: