@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), 可能出现的原因如下:

解决办法

  1. dataParam 格式错误,不符合json字符串规范
  2. dataParam 参数不能绑定到控制器方法的参数上面,不是一一对应
  3. 没有在ajax提交时设置contentType
    contentType指的是前台传递到后台的格式,dataType指的是由后台传到前台的格式
  4. jackson的jar包不对或者不全:
    不应该使用org.codehaus.jackson下面的jackson.jar, 应该使用com.fasterxml.jackson.core下面的jackson-core和jackson-databind 的jar包
  5. 加上
    加上后加上 错误解决。

问题:出现了返回值请求乱码的问题,

原因分析:(网上基本都是一致的答案)
首先:确定的是(经过多次测试的结果)只有当返回值是 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);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值