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请求的示例图:
get请求的示例图
post请求的示例图:
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与实体的转换,只要能映射上去(也就是字段名jsonkey相对应,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部分组成(请求行+请求头+请求体):
在这里插入图片描述
实际的请求报文示例图:
在这里插入图片描述

  • ①是请求方法,GETPOST是最常见的HTTP方法,除此以外还包括DELETEHEADOPTIONSPUTTRACE。不过,当前的大多数浏览器只支持GETPOST,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&param2=value2的键值对形式编码成一个格式化串,它承载多个请求参数的数据。不但报文体可以传递请求参数,请求URL也可以通过类似于/chapter15/user.html? param1=value1&param2=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一般有这三种:

  1. application/x-www-form-urlencoded:数据被编码为名称/值对。这是标准的编码格式。默认行为。会将表单内的数据转换拼接成key-value对(非 ASCII 码进行编码)
  2. multipart/form-data(一般用来上传文件): 数据被编码为一条消息,页面上的每个控件对应消息中的一个部分
  3. text/plain: 数据以纯文本形式(text/json/xml/html)进行编码,其中不含任何控件或格式字符。postman软件里标的是RAW

3.3 get/post发送两次请求

点击了解 get/post 发送两次请求的原因

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐