关于媒体类型
关于REST对于媒体类型的处理,主要是这两条语句,以及后面的匹配,具体含义见前文。
第一行:
经过ContentNegotiationManager中的`ContentNegotiationStrategy进行解析, 如果匹配成功,会返回MediaType列表,如果不成功,返回*/*,也就是MediaType.ALL
第二行:
这个地方可以从Controller中的@RequestMapping.produces()进行指定,如果指定了,返回指定的内容,如果不指定,返回可以支持的媒体类型,具体实现见前文。
关于@RequestMapping在这里有两个设置的内容,一个是produces,还有一个是consumes
实验一下:加上produces
/**
* User {@link RestController} 实现
*/
@RestController
public class UserRestController {
@PostMapping(value = "/user" , produces = "application/json;charset=UTF-8")
public User user(@RequestBody User user){
return user;
}
}
进第二行源码可以发现,这时这里有内容了,直接返回设置的produces
接下来,Accept和produces进行匹配,成功返回结果。
那如果不设置Accept呢?第一行这里就是*/*,表示所有类型,后面也会匹配成功。
再看postman的响应头
为了验证这里的Content-type是取得哪,再把produces的改成GBK,结果:最后那个UTF-8忽略
如果两个都不设置呢?从报错情况可以看出,系统会自动设置一个Content-type,然后这个类型不支持。而且debug不会进controller。
加上consumes,这个是对于请求参数进行过滤的,加上以后:
/**
* User {@link RestController} 实现
*/
@RestController
public class UserRestController {
@PostMapping(value = "/user" ,
consumes = "application/json;charset=UTF-8",
produces = "application/json;charset=GBK")
public User user(@RequestBody User user){
return user;
}
}
这里注意一下,由于输入的是utf-8,输出是gbk,所以会有编码问题。