由@RequestParam和@RequestBody引入的get和post各发送两次理解
文章目录1 两个注解理解1.1 @RequestParam1.2 @RequestBody2 Http请求报文剖析3 get和post请求3.1 get请求3.2 post请求1 两个注解理解1.1 @RequestParam@RequestParam用来处理请求头Content-Type: 为 application/x-www-form-urlencoded编码的内容。(Http协议中,...
文章目录
1 两个注解理解
1.1 @RequestParam
1.1.1 讲解
@RequestParam
用来处理请求头Content-Type
: 为 application/x-www-form-urlencoded
编码的内容。(Http
协议中,如果不指定Content-Type
,则默认传递的参数就是application/x-www-form-urlencoded
类型),get
方式中queryString
的值,和post
方式中 body data
的值都会被Servlet
接受到并转化到Request.getParameter()
参数集中,所以@RequestParam
可以获取的到。
get
请求的示例图:
post
请求的示例图:
RequestParam
可以接受简单类型的属性,也可以接受对象类型。
实质是将Request.getParameter()
中的Key-Value
参数Map
利用Spring
的转化机制ConversionService
配置,转化成参数接收对象或字段。
1.1.2 使用@RequestParam接收参数处理
对于 application/x-www-form-urlencoded
的编码,可以是 Get
也可以是 Post
请求,这时候如果是一个一个参数接收就用注解 @RequestParam
或者不用该注解也可以 ,如果用对象统一接收则不用任何注解
@RestController
public class TestController {
@GetMapping("/get")
public String get(@RequestParam("name") String name,@RequestParam("age") int age){
return "name:"+name+" age:"+age;
}
@GetMapping("/get2")
public String get2(UserEntity entity){
return entity.toString();
}
@PostMapping("/post")
public String post(@RequestParam("name") String name,@RequestParam("age") int age){
return "name:"+name+" age:"+age;
}
@PostMapping("/post2")
public String post2(UserEntity entity){
return entity.toString();
}
}
1.2 @RequestBody
@RequestBody
用来处理请求头Content-Type
: 为 application/json
编码的内容,明确的告诉服务器发送的内容是json
。
因为需要读取body中内容,所以只能接受post
请求。
无需手动进行json
与实体的转换,只要能映射上去(也就是字段名
和json
的key
相对应,value
可以匹配上数据类型),那么就可以直接转换
前台请求实例如下:
此处是$.ajax()方法详解
$.ajax({
type: "post",
contentType:"application/json",
url: "repairs/saveDispatches",
data: JSON.stringify(dispatchesDTO),
success: function(data){
if(!data.success){
alertError("派工失败");
}else{
alertSuccess("派工成功");
}
})
后台代码如下:
@RequestMapping("/repairs/saveDispatches")
public void saveDispatches(@RequestBody DispatchesDTO dispatchesDTO,
HttpServletResponse response) throws IOException {
dispatchesService.saveDispatches(dispatchesDTO);
success(response);
}
2 Http请求报文剖析
HTTP请求报文由3部分组成(请求行+请求头+请求体):
实际的请求报文示例图:
- ①是请求方法,
GET
和POST
是最常见的HTTP
方法,除此以外还包括DELETE
、HEAD
、OPTIONS
、PUT
、TRACE
。不过,当前的大多数浏览器只支持GET
和POST
,Spring 3.0提供了一个HiddenHttpMethodFilter
,允许通过_method
的表单参数指定这些特殊的HTTP方法(实际上还是通过POST
提交表单)。服务端配置了HiddenHttpMethodFilter
后,Spring会根据_method参数指定的值模拟出相应的HTTP方法,这样,就可以使用这些HTTP方法对处理方法进行映射了。 - ②为请求对应的URL地址,它和报文头的Host属性组成完整的请求URL
- ③是协议名称及版本号
- ④是
HTTP
的报文头,报文头包含若干个属性,格式为属性名
:属性值
,服务端据此获取客户端的信息
Accept:text/plain response接受类型
Cache-Control: no-cache
Accept-Charset:utf-8
Authorization:
Content-Type: request体类型
host: 域名
refer: 转发
- ⑤是报文体,它将一个页面表单中的组件值通过
param1=value1¶m2=value2
的键值对形式编码成一个格式化串,它承载多个请求参数的数据。不但报文体可以传递请求参数,请求URL
也可以通过类似于/chapter15/user.html? param1=value1¶m2=value2”
的方式传递请求参数。
对照上面的请求报文,把它进一步分解,可以看到一幅更详细的结构图:
3 get和post请求
3.1 get请求
GET
请求 不存在请求实体部分
,键值对参数放置在 URL
尾部,浏览器把form
数据转换成一个字串name1=value1&name2=value2...
,然后把这个字串追加到url
后面,用?
分割,加载这个新的url
。因此请求头不需要设置 Content-Type
字段,就算设置了没什么用,还是用默认的content-type
来进行的: application/x-www-form-urlencoded
非 ASCII
码会自动进行编码转换,例如发送请求:www.bilibili.com?hehe=你的我的
GET
参数的编码方式是无法人为干涉
的 ,这导致了不同浏览器有不同的编码方式,因此最稳妥的方案是人工预编码,人工解码,从而禁止浏览器编码的干涉
3.2 post请求
Http Header
里的Content-Type
一般有这三种:
application/x-www-form-urlencoded
:数据被编码为名称/值对。这是标准的编码格式。默认行为。会将表单内的数据转换拼接成key-value
对(非 ASCII 码进行编码)multipart/form-data
(一般用来上传文件): 数据被编码为一条消息,页面上的每个控件对应消息中的一个部分text/plain
: 数据以纯文本形式(text/json/xml/html
)进行编码,其中不含任何控件或格式字符。postman
软件里标的是RAW
3.3 get/post发送两次请求
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)