当前位置 : 首页 » 文章分类 :  开发  »  Spring-Web

Spring-Web

Spring web 笔记


HTTP Header 中的 Content-Type 和 Accept

HTTP 协议 Header 中的两个东西
Content-Type 和 Accept

ContentType 用来告诉服务器当前发送的数据是什么格式
Accept 用来告诉服务器,客户端能认识哪些格式,最好返回这些格式中的其中一种

举例:
有个用户给我发了一个请求,

请求头中
ContentType =application/json
Accept = /
就是说用户发送的json格式的数据,可以接收任意格式的数据返回

但是我的接口中定义了 consumes={"application/xml"},produces={"application/xml"}
我只接收 application/xml 格式,也只返回xml格式

很明显,用户调不通这个接口

所以我改下 consumes={"application/xml","application/json"},produces={"application/xml"}
注: 除了格式支持,还需要与数据对应的http转换器(HttpMessageConverter)此处先跳过
MediaType 其实就是 application/xml,application/json 等类型格式

Accept

Accept:text/html,application/xml,application/json
将按照如下顺序进行produces的匹配 ①text/html ②application/xml ③application/json

Accept:application/xml;q=0.5,application/json;q=0.9,text/html
将按照如下顺序进行produces的匹配 ①text/html ②application/json ③application/xml
q参数为媒体类型的质量因子,越大则优先权越高(从0到1)

Accept:/,text/,text/html
将按照如下顺序进行produces的匹配 ①text/html ②text/
/


@RequestMapping

@RequestMapping 是一个用来处理请求地址映射的注解,可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。

RequestMapping
https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web/bind/annotation/RequestMapping.html

value

指定请求的实际地址,指定的地址可以是URI Template 模式(后面将会说明);

value的uri值为以下三类:
A) 可以指定为普通的具体值;
B) 可以指定为含有某变量的一类值(URI Template Patterns with Path Variables);

@RequestMapping(value="/owners/{ownerId}", method=RequestMethod.GET)
public String findOwner(@PathVariable String ownerId, Model model) {
  Owner owner = ownerService.findOwner(ownerId);
  model.addAttribute("owner", owner);
  return "displayOwner";
}

C) 可以指定为含正则表达式的一类值( URI Template Patterns with Regular Expressions);

  @RequestMapping("/spring-web/{symbolicName:[a-z-]+}-{version:\d\.\d\.\d}.{extension:\.[a-z]}")
  public void handle(@PathVariable String version, @PathVariable String extension) {
    // ...
  }
}

method

指定请求的method类型, GET、POST、PUT、DELETE等;

consumes

consumes: 指定处理请求的提交内容类型(Content-Type),例如application/json, text/html;

@Controller
@RequestMapping(value = "/pets", method = RequestMethod.POST, consumes="application/json")
public void addPet(@RequestBody Pet pet, Model model) {
    // implementation omitted
}

方法仅处理request Content-Type为“application/json”类型的请求。

produces

produces: 指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回;

@Controller
@RequestMapping(value = "/pets/{petId}", method = RequestMethod.GET, produces="application/json")
@ResponseBody
public Pet getPet(@PathVariable String petId, Model model) {
    // implementation omitted
}

此方法返回的内容类型为application/json;

方法级别覆盖类级别

如类级别的映射为 @RequestMapping(value=”/narrow”, produces=”text/html”),方法级别的为 @RequestMapping(produces=”application/xml”),此时方法级别的映射将覆盖类级别的,因此请求头“Accept:application/xml”是成功的,而“text/html”将报406错误码,表示不支持的请求媒体类型。
只有 consumes/produces 是 覆盖,其他的参数都是继承,如headers、params等都是继承。

组合使用是“或”的关系

@RequestMapping(produces={“text/html”, “application/json”}) 将匹配“Accept:text/html”或“Accept:application/json”

springMVC produces属性含义
https://blog.csdn.net/lzwglory/article/details/17252099

params

params: 指定request中必须包含某些参数值是,才让该方法处理。

@Controller
@RequestMapping("/owners/{ownerId}")
public class RelativePathUriTemplateController {
  @RequestMapping(value = "/pets/{petId}", method = RequestMethod.GET, params="myParam=myValue")
  public void findPet(@PathVariable String ownerId, @PathVariable String petId, Model model) {
    // implementation omitted
  }
}

仅处理请求中包含了名为“myParam”,值为“myValue”的请求;

headers

headers: 指定request中必须包含某些指定的header值,才能让该方法处理请求。

@Controller
@RequestMapping("/owners/{ownerId}")
public class RelativePathUriTemplateController {

@RequestMapping(value = "/pets", method = RequestMethod.GET, headers="Referer=http://www.ifeng.com/")
  public void findPet(@PathVariable String ownerId, @PathVariable String petId, Model model) {
    // implementation omitted
  }
}

仅处理request的header中包含了指定“Refer”请求头和对应值为“http://www.ifeng.com/”的请求

@RequestMapping 用法详解之地址映射
https://blog.csdn.net/walkerJong/article/details/7994326


@RequestBody @ResponseBody 和 转换器 HttpMessageConverter

消费的数据,如JSON数据、XML数据都是由我们读取请求的InputStream并根据需要自己转换为相应的模型数据,比较麻烦;
生产的数据,如JSON数据、XML数据都是由我们自己先把模型数据转换为json/xml等数据,然后输出响应流,也是比较麻烦的。
Spring提供了一组注解(@RequestBody、@ResponseBody)和一组转换类(HttpMessageConverter)来完成我们遇到的问题


上一篇 JSON Web Token(JWT)

下一篇 AWS-S3使用笔记

阅读
1,121
阅读预计5分钟
创建日期 2019-01-09
修改日期 2019-01-09
类别
百度推荐