找回密码
 立即注册
首页 业界区 安全 spring boot--内容协商

spring boot--内容协商

师佳思 6 天前
内容协商

内容协商机制是指服务器根据客户端的请求来决定返回资源的表现形式,由springmvc提供。
就是客户端要什么样的格式,客户端就返回什么样的格式。比如json或者xml。
实现内容协商的两种方式


  • 通过HTTP请求头(如accept)
  • 通过请求参数如:format
指定客户端接收的数据类型。
通过HTTP请求头(如accept)

响应json格式
  1. // 默认响应json字符串@RestControllerpublic class UserController {    @Autowired    private UserService userService;    @GetMapping("/detail")    public User detail(){        return userService.getUserById();    }}
复制代码
响应xml

先引入依赖
  1.                     com.fasterxml.jackson.dataformat            jackson-dataformat-xml        
复制代码
实体类代码
  1. @Data@NoArgsConstructor// 将Java对象转换成xml格式的字符串@JacksonXmlRootElementpublic class User {    private String name;    private Integer age;    public User(String name, Integer age) {        this.name = name;        this.age = age;    }}
复制代码
不用修改controller。这样就会根据客户端请求的accept来返回对应格式的数据。
通过请求参数如:format

请求地址:http://localhost:8080/detail?format=json。如果优先考虑使用format方式,需要以下配置
  1. # 内容协商时,优先考虑请求参数format方式,参数名必须是formatspring.mvc.contentnegotiation.favor-parameter=true# 配置format参数的名称为type,那么请求路径就是http://localhost:8080/detail?type=jsonspring.mvc.contentnegotiation.parameter-name=type
复制代码
消息转换器

请求时通过哪些条件确定使用哪个消息转换器

springmvc会检查请求的content-type。以确定请求体的消息格式。
响应时通过哪些条件确定使用哪个消息转换器

springmvc会检查请求的accept。以确定请求体的消息格式。
定义自己的HTTPMessageConverter

1.引入处理yaml的依赖
  1.     com.fasterxml.jackson.dataformat    jackson-dataformat-yaml
复制代码
2.新增一种媒体类型yaml

配置如下
  1. # 新增一种媒体类型yaml# 媒体类型的名字可以自定义# 媒体类型的名字是yaml  媒体类型的值是text/yamlspring.mvc.contentnegotiation.media-types.yaml=text/yaml
复制代码
3.自定义HttpMessageConverter
  1. // 专门处理yaml数据的消息转换器// 所有的消息转换器必须实现HttpMessageConverter接口,或者继承AbstrcatHttpMessageConverter抽象类public class YamlHttpMessageConverter extends AbstractHttpMessageConverter {    // 对象映射器    private ObjectMapper objectMapper = new ObjectMapper(new YAMLFactory().disable(YAML.Feature.WRITE_DOC_START_MARKER));    // 将媒体类型text/yaml和application/x-yaml与此消息转换器关联起来    public YamlHttpMessageConverter() {        super(new MediaType("text", "yaml", Charset.forName("UTF-8")));    }    // 指定此消息转换器适合哪些类型的对象    @Override    protected boolean supports(Class clazz) {        // 只有User对象才能使用此消息转换器        return User.class.isAssignableFrom(clazz);    }    // 将yaml格式字符串转换成Java对象    // @RequestBody    @Override    protected Object readInternal(Class clazz, HttpInputMessage inputMessage) throws IOException, HttpMessageNotReadableException {        return null;    }    // 将Java对象转换成yaml格式字符串    // @ResponseBody    @Override    protected void writeInternal(Object o, HttpOutputMessage outputMessage) throws IOException, HttpMessageNotWritableException {        objectMapper.writeValue(outputMessage.getBody(), o);    }}
复制代码
4.配置消息转换器

[code]// 添加这个注解后,表示不再使用springboot提供的默认配置// @EnableWebMvc@Configurationpublic class WebConfig implements WebMvcConfigurer {//    将新的消息转换器进行配置    @Override    public void configureMessageConverters(List

相关推荐

前天 21:58

举报

您需要登录后才可以回帖 登录 | 立即注册