【问题标题】:Does HttpMessageConverter<T> converts automatically or do we need to specify in SpringHttpMessageConverter<T> 是自动转换还是我们需要在 Spring 中指定
【发布时间】:2015-10-11 10:08:30
【问题描述】:

我正在使用 java 中的 Spring 我遇到 HttpMessageConverter 用于将响应类型转换为其他类型

我想知道一些关于这个类的事情,这里是一个例子

有一个服务器和一个客户端,服务器以某种格式(比如 XML)发送响应,如果客户端发送类似

headers.setAccept(Arrays.asList(MediaType.APPLICATION_JSON));

HttpMessageConverter 是否会自动将响应的类型转换为 Json 或者在客户端代码中我们需要说 HttpMessageConverter 来转换响应类型

【问题讨论】:

    标签: java json spring http-headers


    【解决方案1】:

    服务器以某种格式(比如 XML)发送响应,客户端想要 如果客户端发送像

    这样的标头,则以其他格式(例如 Json)响应

    有一个概念叫做Content Negotiation或简称​​Conneg。作为客户端,您可以使用AcceptAccept-LanguageAccept-Encoding 等 HTTP 标头指定预期的内容类型、语言、编码等,并将该请求发送到服务器,服务器会做出相应的响应。因此,如果您将 Accept 标头设置为 application/json 并且服务器 only 可以提供 application/xml 内容类型,它将返回 406 Not Acceptable HTTP 客户端错误。 基本上它说我可能有你想要的资源,但没有请求的表示

    如果您有权访问服务器代码,则可以更改您的 Data Transfer Objects,以便 spring 可以将它们转换为 xmljson。只需用@ResponseBody注释每个方法,该方法的返回值就可以转换为默认的HttpMessageConverters:

    您可以使用 HttpMessage 转换器。 HttpMessageConverter 负责 从 HTTP 请求消息转换为对象并转换 从对象到 HTTP 响应正文。这 RequestMappingHandlerAdapter 支持 @RequestBody 注释 以下默认 HttpMessageConverters:

    • ByteArrayHttpMessageConverter 转换字节数组。
    • StringHttpMessageConverter 转换字符串。
    • FormHttpMessageConverter 将表单数据与 MultiValueMap 相互转换。
    • SourceHttpMessageConverter 与 javax.xml.transform.Source 相互转换

    此外,如果您将 Jackson 2 库添加到类路径中,MappingJackson2HttpMessageConverter 将负责与 JSON 之间的转换。

    但是,如果您无法访问服务器代码并且服务器只提供 XML,那么唯一的选择就是从服务器获取 XML 并手动将其转换为 JSON。

    【讨论】:

    • 所以即使我保留了标题 headers.setAccept(Arrays.asList(MediaType.APPLICATION_JSON)); HttpMessageConverter 是否会在客户端自动将响应类型转换为 json,还是我需要在客户端代码中使用 HttpMessageConverter 来转换为 json
    • 如果您将Accept 设置为application/json 并且您的服务仅服务aplication/xml,那么您很有可能会收到415 HTTP 错误。我想最好将Accept 设置为application/xml,然后获取xml 并反序列化为一个DTO,它可以通过jackson 转换为JSON
    • 那么默认的HttpMessageConverters是什么意思或者他们做了什么
    • 假设你有服务器方法,比如doStuff(Resource res)。如果客户端向此服务发送POST 请求,默认转换器将尝试将请求正文转换为Resource 类的实例。客户也会发生同样的情况。您想要的是一种通过这种转换器将 XML 转换为 JSON 的方法,这有点荒谬。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-04
    • 2018-10-30
    • 2012-08-07
    • 1970-01-01
    相关资源
    最近更新 更多