SpringMVC 中@RequestParam注解、@RequestHeader注解、@RequestBody注解请求
做开发的时候,有的时候经常弄混这几种区别,今天在掘金看到一篇文章,所以记录一下一次搞定SpringMVC参数绑定
@RequestHeader注解
@RequestHeader 注解,可以把Request请求header部分的值绑定到方法的参数上。注意我们发送的数据是在header部分,复习一下 http的请求报文格式
POST /?id=1 HTTP/1.1 //请求行
Host: echo.paw.cloud //请求头部
Content-Type: application/json; charset=utf-8
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:53.0) Gecko/20100101 Firefox/53.0
Connection: close
Content-Length: 136
//空行
{ //请求体
"status": "ok",
"extended": true,
"results": [
{"value": 0, "type": "int64"},
{"value": 1.0e+3, "type": "decimal"}
]
}
所以如果我们的请求方法这样写
@RequestMapping("/header")
public void testHeaderParam(HttpServletRequest request, @RequestHeader String param1) {
System.out.println("通过RequestHeader获取的参数param1=" + param1);
}
那么不论get 还是post方法,postman都可以这样发送请求
最后的控制台打印结果为:通过RequestHeader获取的参数param1=test
@RequestParam注解
这一端是从参考博文粘贴过来的:
@RequestParam注解用来处理Content-Type: 为 application/x-www-form-urlencoded编码的内容。提交方式为get或post。(Http协议中,form的enctype属性为编码方式,常用有两种:application/x-www-form-urlencoded和multipart/form-data,默认为application/x-www-form-urlencoded);
@RequestParam注解实质是将Request.getParameter() 中的Key-Value参数Map利用Spring的转化机制ConversionService配置,转化成参数接收对象或字段,get方式中queryString的值,和post方式中body data的值都会被Servlet接受到并转化到Request.getParameter()参数集中,所以@RequestParam可以获取的到;
所以如果代码这样写
@RequestMapping("/param")
public void testRequestParam(HttpServletRequest request,
@RequestParam(value = "num", required = true, defaultValue = "0") int num) {
System.out.println("通过RequestParam获取的参数num=" + num);
}
对于Get 方式
对于Post方式
我自己测试有两种方式
1.既可以把参数放入body方式,以application/x-www-form-urlencoded 发送
2.也可以像 Get方式,把参数放入url中
@RequestBody注解
@RequestBody注解用来处理HttpEntity(请求体)传递过来的数据,一般用来处理非Content-Type: application/x-www-form-urlencoded编码格式的数据;GET请求中,因为没有HttpEntity,所以@RequestBody并不适用;POST请求中,通过HttpEntity传递的参数,必须要在请求头中声明数据的类型Content-Type,SpringMVC通过使用HandlerAdapter配置的HttpMessageConverters来解析HttpEntity中的数据,然后绑定到相应的bean上。
@RequestMapping("/body")
public void testRequestBody(HttpServletRequest request, @RequestBody String bodyStr){
System.out.println("通过RequestBody获取的参数bodyStr=" + bodyStr);
}
既然只有post方式的,指定 Content-Type: 不为 application/x-www-form-urlencoded,我指定为text/plain,那么控制台为:
通过RequestBody获取的参数bodyStr=ewq2
一般@RequestBody 绑定的是一个对象,那么就可以前台请求体为JSON,后台就可以接收到了
推荐阅读
-
SpringMVC中@RequestParam注解作用
-
springMvc入门 三.Scope注解与@RequestParam注解
-
SpringMVC 中@RequestParam注解、@RequestHeader注解、@RequestBody注解请求
-
springmvc注解RequestBody和ResponseBody
-
SpringMVC的RequestBody注解
-
SpringMVC中RequestMapping注解(作用、出现的位置、属性)
-
SpringMVC中@RequestMapping处理请求参数的@RequestParam注解
-
SpringMVC中与Spring相关的@注解
-
SpringMVC重要注解(三)@RequestParam
-
SpringMVC @RequestMapping注解(重点)、@RequestParam注解、@PathVariable注解