@RequestParam与@RequestBody的总结使用
简单定义
@RequestParam
该注解用于将HTTP请求参数映射到处理程序方法的参数上。@RequestParam可以用于处理单个请求参数或多个参数,它可以指定必需的参数和默认值,以及请求参数名称等。
@RequestBody
该注解用于指示SpringMVC应从HTTP请求体中获取数据。它通常与@Controller配合使用。@RequestBody注解会将HTTP请求正文中的JSON、XML或其他格式的数据绑定到Java对象上。
两者区别
功能
@RequestParam用于将HTTP请求中的参数绑定到方法的参数上,主要用于处理GET请求的参数或POST请求中的表单参数。
@RequestBody用于接收整个请求体,并将其转换为方法参数所需的对象或数据类型。
数据类型
@RequestParam注解可以绑定简单类型的参数(如字符串、整数等),也可以绑定复杂类型的参数(如自定义对象)。
@RequestBody注解通常用于绑定复杂类型的参数,例如JSON格式的请求体,会将请求体的JSON数据转换为指定的Java对象。
绑定方式
@RequestParam注解通过查询字符串或表单参数的方式来获取参数值。@RequestBody注解通过接收整个请求体,并将其转换为方法参数所需的对象或数据类型。
两种注解的实践
前置知识点
Content-Type请求头–Request-Headers:一般我们在 post 请求中会向服务器发送一些参数,那我们就可以通过这个参数设置 post 的参数格式
application/json:JSON 数据格式;
application/x-www-form-urlencoded:表单默认的提数据格式;
multipart/form-data:一般用于文件上传;
服务端现有一个初始化方法
public String init(Map<String Object> paramMap)
Map <String Object> paramMap = new HashMap<>();
paramMap.put("1":"{\"ids\":[\"1\",\"2\"]}");
使用HttpRequest.post 发送请求进行测试。
@RequestParam实践
@RequestParam用来处理Content-Type为application/x-www-form-urlencoded编码的内容,Content-Type默认为该属性。
x-www-form-urlencoded是一种数据编码格式,用于将表单数据转换为 URL 可传输的格式。它将表单数据编码为键值对,类似 URL 查询参数。在这种格式下,字符(比如空格)被转换为%XX,其中XX表示字符的 ASCII 码的十六进制值,空格被转换为+符号。当浏览器提交一个表单时,如果表单的enctype设置为application/x-www-form-urlencoded(这是默认的),浏览器会将表单数据转换成一个巨大的查询字符串,按照名=值对格式排列,每对之间用&分隔。
String json = HttpRequest.post(url)
.header(Header.COOKIE, COOKIE)//头信息,多个头信息多次调用此方法即可
//发送的是表单内容,方法用的是@RequestParam,成功验证。
.form(paramMap)
.timeout(20000)//超时,毫秒
.execute().body();
使用的是.form(paramMap)发送的是表单内容,所以服务端需要添加@RequestParam,但是如果参数名称与form中的那么相同,就可以去掉。
@RequestBody实践
既然使用@RequestParam可以成功调用,如果要想发批量的JSON格式,就需要使用@RequestBody注解
String json = HttpRequest.post(url)
.header(Header.COOKIE, "")//头信息,多个头信息多次调用此方法即可
//发送的是请求体,方法用的是@RequestBody,成功验证。
.body(paramMap)
.timeout(20000)//超时,毫秒
.execute().body();
实践过程中出现的问题
问题:出现了415错误
当我添加后,出现了415错误。
The server refused this request because the request entity is in a format not supported by the requested resource for the requested method.
”服务器拒绝了此请求,因为请求实体的格式不受请求方法的请求资源支持”。
还是请求参数的问题,应该按照以下步骤进行排查
注:在jsp中使用ajax提交时出现了下面的问题: 415 (Unsupported Media Type), 可能出现的原因如下:
解决办法
- dataParam 格式错误,不符合json字符串规范
- dataParam 参数不能绑定到控制器方法的参数上面,不是一一对应
- 没有在ajax提交时设置contentType
contentType指的是前台传递到后台的格式,dataType指的是由后台传到前台的格式 - jackson的jar包不对或者不全:
不应该使用org.codehaus.jackson下面的jackson.jar, 应该使用com.fasterxml.jackson.core下面的jackson-core和jackson-databind 的jar包 - 加上
加上后加上 错误解决。
问题:出现了返回值请求乱码的问题,
原因分析:(网上基本都是一致的答案)
首先:确定的是(经过多次测试的结果)只有当返回值是 String时才会出现中文乱码,而当返回值是Map<String, Object>或者是其它类型时,并没有中文乱码的出现.
然后找原因: 原因是这可以说是spring mvc的一个bug,spring MVC有一系列HttpMessageConverter去处理用@ResponseBody注解的返回值,如返回list或其它则使用 MappingJacksonHttpMessageConverter,返回string,则使用 StringHttpMessageConverter,而这个convert使用的是字符集是iso-8859-1,而且是final的。所以在当返回json中有中文时会出现乱码。
不加@ResponseBody 会出现
虽然是请求成功,但是如果只想需要结果值话还是需要@ResponseBody
解决办法
在@RequestMapping里的配置produces={“text/html;charset=UTF-8;”,“application/json;”} 乱码消失
这样设置,这样普通浏览器的请求就能正常显示中文,而客户端的模拟请求(可以是ajax或http)则手动指定Accept的charset,即可正常接收中文。
问题:Object转对象先转jsonstring。
不能是string,会将object中得Id:1 转成String Id=1
String jsonString = JSON.toJSONString(idString);
Student student =JSON.parseObject(jsonString, Student.class);