网络

教育改变生活

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1661|回复: 0
打印 上一主题 下一主题

SpringMVC中post和get的区别

[复制链接]

418

主题

419

帖子

1710

积分

版主

Rank: 7Rank: 7Rank: 7

积分
1710
跳转到指定楼层
楼主
发表于 2021-6-4 08:14:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在讲区别前先讲一下@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码(中文)就会根据不同浏览器的默认编码去解析,从而导致乱码
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

WEB前端

QQ|手机版|小黑屋|金桨网|助学堂  咨询请联系站长。

GMT+8, 2024-12-23 00:02 , Processed in 0.035248 second(s), 21 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表