SpringMVC中post和get区别

SpringMVC中post和get区别



一、主要区别

get与post两种方式的区别:对于本次主题而言,最显著的区别就是get请求方式参数是在url后,而post请求方式的参数是在request body中。因此两者获取参数的方式也大不一样。
最直观的区别就是GET把参数包含在URL中,POST通过request body传递参数。

二、其余解释

 主要区别在于GET方法是请求读取由URL所标志的信息,POST是给服务器添加信息。
注意:在请求中,只有post请求方式,才会有请求体;get方式的请求,请求数据中是没有请求体的。
post请求方式  可以携带参数类      POST通过request body传递参数。
get请求方式    不可以携带参数类   ,参数只能拼接到url路径里

GET和POST还有一个重大区别,简单的说:
GET产生一个TCP数据包;POST产生两个TCP数据包。
长的说:
对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据);
而对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)。
也就是说,GET只需要汽车跑一趟就把货送到了,而POST得跑两趟,第一趟,先去和服务器打个招呼“嗨,我等下要送一批货来,你们打开门迎接我”,然后再回头把货送过去。
因为POST需要两步,时间上消耗的要多一点,看起来GET比POST更有效。因此Yahoo团队有推荐用GET替换POST来优化网站性能。但这是一个坑!跳入需谨慎。为什么?

  1. GET与POST都有自己的语义,不能随便混用。
  2. 据研究,在网络环境好的情况下,发一次包的时间和发两次包的时间差别基本可以无视。而在网络环境差的情况下,两次包的TCP在验证数据包完整性上,有非常大的优点。
  3. 并不是所有浏览器都会在POST中发送两次包,Firefox就只发送一次。

在这里插入图片描述

在讲区别前先讲一下@RequestBody。
@RequestBody主要用来接收前端传递给后端的json字符串中的数据的(请求体中的数据的);
GET方式无请求体,所以使用@RequestBody接收数据时,前端不能使用GET方式提交数据,而是用POST方式进行提交。

get请求:在常规理解上来,是跟在地址栏后方的众多变量,在后台接收的时候,我们可以定义一个包装对象,或者是直接用参数来接收,或者用Map来接收都可以,其中我们可能会用到@RequestParam注解来对接收到的数据进行默认赋值,是否是必须字段等实现功能。
post请求:post请求是接收一个表单内部的数据,我们平时采用的方式也是定义包装类对象来接收。当然,在前后端分离的情况下(前台向后台传递一个JSON字符串时),我们要采用@RequestBody来将其转化为我们所要的包装类对象。那么重头戏来了,设计个场景:
前台向后台传递JSON字符串数据时,一个包装类无法存放方法体中的数据(即有部分属性不在你定义的包装类中时),那么当接收数据的时候,可以用两个对象(都采用@RequestBody(可以省略))来接收吗?答案是不可以,因为一个post请求也只传递一个整体表单数据,同样@RequestBody在入参中只能定义一次,将表单数据封装成一个对象接收。针对这种情况,解决办法 ,可以重新定义一个接收参数的包装类,当然这样有点费事。我有三种用法,1、可以用一个对象和几个像String id这样的对象;2、在入参处定义一个Map,然后针对性的从Map当中取数据;3、在参数中将所有属性都一一定义成局部变量,采用@RequestParam注解从前台也可以获取到值,代入其中去运算。
这里还有一个通用的方法,也是较原生的:使用request.getParameter()方式获取参数,所以可以处理get 方式中queryString的值,也可以处理post方式中 body data的值。
所以在使用SpringMVC时应注意:
1、前端传对象,只能是post请求,后台用@RequestBody将json对象转化为字符串然后接收(post)
2、前端用get请求就不能用@RequestBody(最开始讲过),而用request.getParameter或者@RequestParam或者@PathVariable(URL中没有 字段=xx)
这里再补充一下@RequestParam或者@PathVariable的区别
ResquestMapping(“…/{id}”)
这里的主要作用为
将请求URL中的模板变量映射到功能处理方法的参数上
(@PathVariable(“id”) interger abc)
要求:前端传来的连接必须是 …/…/123131

@RequestParam就是可以说明是否必须,还能设置默认值
(@RequestParam(value = “id”, required = false, defaultValue = “0”),@RequestParam(value=“username”) String userName
要求有?有字段=…
地址①http://localhost:8989/SSSP/emps?pageNo=2
地址②http://localhost:8989/SSSP/emp/7
如果想获取地址①中的 pageNo的值 ‘2’ ,则使用 @RequestParam ,也可以不用
如果想获取地址②中的 emp/7 中的 ‘7 ’ 则使用 @PathVariable

3、如果是用get请求,url中如果是ASCLL码就不会有事,如果是非ASCLL码(中文)就会根据不同浏览器的默认编码去解析,从而导致乱码

三、视频中讲的区别

1、GET请求一般用去请求获取数据,

    POST一般作为发送数据到后台时使用

2、GET请求也可传参到后台,但是其参数在浏览器的地址栏的url中可见,所以隐私性安全性较差,且参数长度也是有限制的

    POST请求传递参数放在Request body中,不会在url中显示,比GET要安全,且参数长度无限制

3、GET请求刷新浏览器或回退时没有影响

    POST回退时会重新提交数据请求

4、GET 请求可被缓存

    POST 请求不会被缓存

5、GET 请求保留在浏览器历史记录中

   POST 请求不会保留在浏览器历史记录中

6、GET 请求可被收藏为书签

    POST 不能被收藏为书签

7、GET请求只能进行url编码(application/x-www-form-urlencoded)

    POST支持多种编码方式(application/x-www-form-urlencoded 或 multipart/form-data。为二进制数据使用多重编码。)

8、GET请求比较常见的方式是通过url地址栏请求

    POST最常见是通过form表单发送数据请求

get请求不安全 但是快 数据量有限 文件上传是不能使用get 因为请求参数不能拼接到地址栏
post 请求安全 数据量可以认为是无线 上传文件只能用post

四、自己理解

HTTP协议的基本请求方法

HTTP协议定义了很多与扶额u其交互的方法,最基本的只有四种:GET,POST,DELETE,PUT;

一个url地址用于描述一个网络上的资源,http中的四个基本请求方法对应这个资源的增删查改四个操作;

最常见的请求GET和POST:

GET:请求读取一个Web页面,一般用于获取/查询资源信息;

POST:上传一个资源(如Web页面),一般用于更新资源信息;

在这里插入图片描述

GET请求

从指定的资源请求数据,用于获取数据,一般用于搜索排序和筛选之类的操作。

get请求其实就是通过URL来传递数据。当客户端要从服务器中读取文档时,当点击网页上的链接,或者在浏览器地址栏输入网址浏览网页,都是GET请求方式。

使用GET方法时,请求参数和对应的值附加在URL后面,利用一个问号(“?”)代表URL的结尾与请求参数的开始(?query),传递参数长度受限制(不同浏览器不同)。

POST请求

向指定的资源提交要被处理的数据,用于将数据发送给服务器,一般用于修改和写入数据。

使用POST方法可以允许客户端给服务器提供信息较多。POST方法将请求参数封装在HTTP请求数据中,以名称/值的形式出现,可以传输大量数据,这样POST方式对传送的数据大小没有限制,而且也不会显示在URL中。

GET和POST区别

get请求和post请求本质上就是TCP链接,并无差别。但是由于HTTP的规定和浏览器/服务器的限制,导致他们在应用过程中体现出一些不同。

(1)post请求更安全(不会作为url的一部分,不会被缓存、保存在服务器日志、以及浏览器浏览记录中,get请求的是静态资源,则会缓存,如果是数据,则不会缓存)

(2)post请求发送的数据更大(get请求有url长度限制,http协议本身不限制,请求长度限制是由浏览器和web服务器决定和设置)

(3)post请求能发送更多的数据类型(get请求只能发送ASCII字符)

(4)传参方式不同(get请求参数通过url传递,post请求放在request body中传递)

(5)get请求的是静态资源,则会缓存,如果是数据,则不会缓存

(6)get请求产生一个TCP数据包;post请求产生两个TCP数据包(get请求,浏览器会把http header和data一并发送出去,服务器响应200返回数据;post请求,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 返回数据)。

posted @   依嘫  阅读(254)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
点击右上角即可分享
微信分享提示