Spring MVC 请求和响应的整体处理

@RequestBody

  • 当注解方法入参的时候,如果是对应的Java Bean,就会对Java Bean的属性进行注入;如果参数是String类型,就会将整个请求体交给该参数
    @RequestMapping("/getJsonTest")
      public String getJsonTest(@RequestBody Employee employee) {
        System.out.println(employee);
        return "success";
      }
    
      @RequestMapping("/requestBodyTest")
      public String requestBodyTest(@RequestBody String requestBody) {
        System.out.println(requestBody); // {"id":0,"name":"john","gender":"male"}
        return "success";
      }
    

HttpEntity

  • 当方法的入参为 HttpEntity 类型的时候,会将接收到的完整的请求信息包装成HttpEntity交给参数。
  • HttpEntity 包含有请求头和请求体的内容。

ResponseEntity

  • ResponseEntity 可以作为请求映射方法的返回对象,可以设置请求头、请求体、Http状态内容。

示例一

  @RequestMapping("/httpEntityTest")
  public ResponseEntity<String> httpEntityTest(HttpEntity<String> httpEntity) {
    System.out.println(httpEntity);
    HttpHeaders headers = httpEntity.getHeaders(); // [host:"localhost:8080", connection:"keep-alive", content-length:"38", accept:"*/*", origin:"http://localhost:8080", x-requested-with:"XMLHttpRequest", user-agent:"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3861.400 QQBrowser/10.7.4313.400", referer:"http://localhost:8080/databinder/sendJson.jsp", accept-encoding:"gzip, deflate, br", accept-language:"zh-CN,zh;q=0.9", cookie:"JSESSIONID=39099CC91B33EAED591D26A1CD87732A", Content-Type:"application/json;charset=UTF-8"]
    System.out.println(headers);

    String body = httpEntity.getBody();  // {"id":0,"name":"john","gender":"male"}
    System.out.println(body);

    HttpHeaders responseHeaders = new HttpHeaders();
    responseHeaders.add("Content-Type", "application/json");
    return new ResponseEntity<>(body, responseHeaders, HttpStatus.OK);
  }

示例二:下载文件

  @RequestMapping("/download")
  public ResponseEntity<byte[]> download(HttpServletRequest request) throws Exception {
    // 设置响应头
    HttpHeaders httpHeaders = new HttpHeaders();
    httpHeaders.set("Content-Disposition", "attachment;filename=jquery-1.7.2.js");
    // 读取文件流
    InputStream inputStream = request.getServletContext().getResourceAsStream("script/jquery-1.7.2.js"); // 文件在webapp文件夹下的路径
    byte[] bytes = new byte[inputStream.available()];
    if (inputStream.read(bytes) > 0) System.out.println("文件读取成功");
    // 返回响应整体
    return new ResponseEntity<>(bytes, httpHeaders, HttpStatus.OK);
  }

原理:HttpMessageConverter

  • HttpMessageConverter<T> 是 Spring3.0 新添加的一个接口,负责将请求信息转换为一个对象(类型为 T),将对象(类型为 T)输出为响应信息
    在这里插入图片描述
  • 使用 HttpMessageConverter<T> 将请求信息转化并绑定到处理方法的入参中或将响应结果转为对应类型的响应信息,Spring 提供了两种途径:
    • 使用 @RequestBody / @ResponseBody 对处理方法进行标注
    • 使用 HttpEntity<T> / ResponseEntity<T> 作为处理方法的入参或返回值
  • 当控制器处理方法使用到 @RequestBody/@ResponseBodyHttpEntity<T>/ResponseEntity<T>
    • Spring 首先根据请求头或响应头的 Accept 属性选择匹配的 HttpMessageConverter
    • 进而根据参数类型或泛型类型的过滤得到匹配的HttpMessageConverter
    • 若找不到可用的 HttpMessageConverter 将报错
  • @RequestBody@ResponseBody 不需要成对出现
  • HttpMessageConverter<T> 的实现类
    在这里插入图片描述
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值