1、自定义一个我们自己的协议x-djy
(1)创建DjyHttpMessageConverter类
public class DjyHttpMessageConverter implements HttpMessageConverter<Pet> {
@Override
public boolean canRead(Class<?> clazz, MediaType mediaType) {
return false;
}
@Override
public boolean canWrite(Class<?> clazz, MediaType mediaType) {
return clazz.isAssignableFrom(Pet.class);
}
@Override
public List<MediaType> getSupportedMediaTypes() {
return MediaType.parseMediaTypes("application/x-djy;charset=UTF-8");
}
@Override
public Pet read(Class<? extends Pet> clazz, HttpInputMessage inputMessage) throws IOException, HttpMessageNotReadableException {
return null;
}
@Override
public void write(Pet pet, MediaType contentType, HttpOutputMessage outputMessage) throws IOException, HttpMessageNotWritableException {
final HttpHeaders headers = outputMessage.getHeaders();
headers.setContentType(contentType);
OutputStream body = outputMessage.getBody();
String data = pet.getName()+","+pet.getAge();
OutputStreamWriter outputStreamWriter = new OutputStreamWriter(body, Charset.defaultCharset());
outputStreamWriter.write(data);
outputStreamWriter.flush();
}
}
(2)创建配置类用哪个@Configuration+@Bean的方式 注入WebMvcConfigurer对象,实现WebMvcConfigurer里面的extendMessageConverters方法
- extendMessageConverters 是可以补充我们自己的响应处理类
configureMessageConverters是会直接替换所有消息响应类,使用你自定义的
@Configuration(proxyBeanMethods = false)
public class MyConfig{
@Bean
public WebMvcConfigurer webMvcConfigurer(){
WebMvcConfigurer webMvcConfigurer = new WebMvcConfigurer() {
@Override
public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
converters.add(new DjyHttpMessageConverter());
}
};
return webMvcConfigurer;
}
}
(3)请求接口
@ResponseBody @GetMapping("/pet") public Pet getPet(){ Pet pet = new Pet(); pet.setAge(3); pet.setName("小花"); return pet; }
(4)用Postman测试请求头中添加accept参数,设置值application/x-djy
2、开启请求参数format功能
(1)application.yaml中开启参数
spring: mvc: contentnegotiation: favor-parameter: true
(2)开启之后我们就可以使用format来请求数据,但是format默认只支持2种数据
format=json
- format=xml
(3)我们把上面的x-djy协议也加入到format中
- 需要在Spring配置类中添加format协议支持
- 通过WebMvcConfigurer中的configureContentNegotiation方法
添加自定义的协议到format中configurer.mediaType(“x-djy”,MediaType.parseMediaType(“application/x-djy”));
@Configuration(proxyBeanMethods = false) public class MyConfig{ @Bean public WebMvcConfigurer webMvcConfigurer(){ WebMvcConfigurer webMvcConfigurer = new WebMvcConfigurer() { @Override public void extendMessageConverters(List<HttpMessageConverter<?>> converters) { converters.add(new DjyHttpMessageConverter()); } @Override public void configureContentNegotiation(ContentNegotiationConfigurer configurer) { configurer.mediaType("x-djy", MediaType.parseMediaType("application/x-djy")); } }; return webMvcConfigurer; } }
也可以使用ContentNegotiationConfigurer的strategies方法来添加协议
@Override public void configureContentNegotiation(ContentNegotiationConfigurer configurer) { //configurer.mediaType("x-djy", MediaType.parseMediaType("application/x-djy")); HashMap<String, MediaType> stringMediaTypeHashMap = new HashMap<>(); stringMediaTypeHashMap.put("json",MediaType.parseMediaType("application/json")); stringMediaTypeHashMap.put("x-djy",MediaType.parseMediaType("application/x-djy")); //值得注意的是,我们从底层了解到,即使你不设置xml的支持,底层在找能不能支持这种类型的时候,也会从底层的支持的文件类型中查找 //所以你完全可以不设置json和xml也可以返回这些协议 ParameterContentNegotiationStrategy parameterContentNegotiationStrategy = new ParameterContentNegotiationStrategy(stringMediaTypeHashMap); configurer.strategies(Arrays.asList(parameterContentNegotiationStrategy)); }
(4)测试可以得到数据