1、自定义一个我们自己的协议x-djy

(1)创建DjyHttpMessageConverter类

  1. public class DjyHttpMessageConverter implements HttpMessageConverter<Pet> {
  2. @Override
  3. public boolean canRead(Class<?> clazz, MediaType mediaType) {
  4. return false;
  5. }
  6. @Override
  7. public boolean canWrite(Class<?> clazz, MediaType mediaType) {
  8. return clazz.isAssignableFrom(Pet.class);
  9. }
  10. @Override
  11. public List<MediaType> getSupportedMediaTypes() {
  12. return MediaType.parseMediaTypes("application/x-djy;charset=UTF-8");
  13. }
  14. @Override
  15. public Pet read(Class<? extends Pet> clazz, HttpInputMessage inputMessage) throws IOException, HttpMessageNotReadableException {
  16. return null;
  17. }
  18. @Override
  19. public void write(Pet pet, MediaType contentType, HttpOutputMessage outputMessage) throws IOException, HttpMessageNotWritableException {
  20. final HttpHeaders headers = outputMessage.getHeaders();
  21. headers.setContentType(contentType);
  22. OutputStream body = outputMessage.getBody();
  23. String data = pet.getName()+","+pet.getAge();
  24. OutputStreamWriter outputStreamWriter = new OutputStreamWriter(body, Charset.defaultCharset());
  25. outputStreamWriter.write(data);
  26. outputStreamWriter.flush();
  27. }
  28. }

(2)创建配置类用哪个@Configuration+@Bean的方式 注入WebMvcConfigurer对象,实现WebMvcConfigurer里面的extendMessageConverters方法

  • extendMessageConverters 是可以补充我们自己的响应处理类
  • configureMessageConverters是会直接替换所有消息响应类,使用你自定义的

    1. @Configuration(proxyBeanMethods = false)
    2. public class MyConfig{
    3. @Bean
    4. public WebMvcConfigurer webMvcConfigurer(){
    5. WebMvcConfigurer webMvcConfigurer = new WebMvcConfigurer() {
    6. @Override
    7. public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
    8. converters.add(new DjyHttpMessageConverter());
    9. }
    10. };
    11. return webMvcConfigurer;
    12. }
    13. }

    (3)请求接口

      @ResponseBody
      @GetMapping("/pet")
      public Pet getPet(){
          Pet pet = new Pet();
          pet.setAge(3);
          pet.setName("小花");
          return pet;
      }
    

    (4)用Postman测试请求头中添加accept参数,设置值application/x-djy
    image.png

    2、开启请求参数format功能

    (1)application.yaml中开启参数

    spring:
    mvc:
      contentnegotiation:
        favor-parameter: true
    

    (2)开启之后我们就可以使用format来请求数据,但是format默认只支持2种数据

  • format=json

  • format=xml

image.png
(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)测试可以得到数据
image.png