1.内容协商机制
根据客户端接收能力不同,SpringBoot 返回不同媒体类型的数据
比如: 客户端 Http 请求 Accept: application/xml 则返回 xml 数据,客户端 Http 请求 Accept: application/json 则返回 json 数据
SpringBoot 默认支持返回Json数据,默认不支持返回xml数据,所以需要导入jackson-dataformat-xml 让SpringBoot支持返回xml数据
<!-- 引入支持返回 xml 数据格式 --> <dependency> <groupId>com.fasterxml.jackson.dataformat</groupId> <artifactId>jackson-dataformat-xml</artifactId> </dependency>
如果客户端请求头的 Accept为application/xml 则返回 xml 数据,客户端 Http 请求 Accept为application/json 则返回 json 数据
@RestController public class HmcController { @RequestMapping("param") public ReUser param(){ return new ReUser("Levi 张三",18); } }
2.基于请求参数的内容协商
为什么会出现基于请求参数的内容协商,因为游览器无法更改请求头中的Accept参数,所以我们可以通过设置请求参数
来获取我们想要服务器返回的参数类型
spring: mvc: contentnegotiation: favor-parameter: true #开启请求参数内容协商模式
获取Json格式数据:http://localhost:8082/param?format=json
获取Xml格式数据:http://localhost:8082/param?format=xml
3.自定义内容协商
自定义协商器
public class MyHttpMessageConverter implements HttpMessageConverter<ReUser> { //默认字符 private static final Charset DEFAULT_CHARSET=Charset.forName("UTF-8"); //是否可读 @Override public boolean canRead(Class<?> clazz, MediaType mediaType) { return false; } //是否可写 @Override public boolean canWrite(Class<?> clazz, MediaType mediaType) { return clazz.isAssignableFrom(ReUser.class); } //支持的类型 @Override public List<MediaType> getSupportedMediaTypes() { return MediaType.parseMediaTypes("application/type-x"); } //读 处理 @Override public ReUser read(Class<? extends ReUser> clazz, HttpInputMessage inputMessage) throws IOException, HttpMessageNotReadableException { return null; } //写 处理 @Override public void write(ReUser reUser, MediaType contentType, HttpOutputMessage outputMessage) throws IOException, HttpMessageNotWritableException { //设置为自定义格式 String data=reUser.getName()+"-"+reUser.getAge(); //写出去 StreamUtils.copy(data,DEFAULT_CHARSET,outputMessage.getBody()); } }
配置自定义协商器
@Configuration public class MyConfiguration implements WebMvcConfigurer { @Override public void configureContentNegotiation(ContentNegotiationConfigurer configurer) { //设置支持返回的类型 Map<String, MediaType> mediaTypes = new HashMap<>(); mediaTypes.put("json",MediaType.APPLICATION_JSON); mediaTypes.put("xml",MediaType.APPLICATION_XML); mediaTypes.put("type-x",MediaType.parseMediaType("application/type-x")); //指定支持解析哪些参数对应的哪些媒体类型 ParameterContentNegotiationStrategy parameterStrategy = new ParameterContentNegotiationStrategy(mediaTypes); HeaderContentNegotiationStrategy headerStrategy = new HeaderContentNegotiationStrategy(); configurer.strategies(Arrays.asList(parameterStrategy,headerStrategy)); } @Override public void extendMessageConverters(List<HttpMessageConverter<?>> converters) { //添加自定义的内容协商 converters.add(new MyHttpMessageConverter()); //添加自定义的内容协商 设置优先级 //converters.add(0,new MyHttpMessageConverter()); } }
标签:xml,SpringBoot,自定义,协商,MediaType,Override,机制,public From: https://www.cnblogs.com/ErenYeager/p/17013042.html