我在java中使用Spring我遇到了HttpMessageConverter,用于将响应类型转换为其他类型
我想知道这个类的一些事情是一个例子
有一个服务器和一个客户端,服务器以某种格式发送响应(比如XML),如果客户端发送像
这样的标题,客户端想要其他格式的响应(比如说Json)headers.setAccept(Arrays.asList(MediaType.APPLICATION_JSON));
HttpMessageConverter是否会自动将响应类型转换为Json,否则在客户端代码中我们需要说HttpMessageConverter来转换响应类型
答案 0 :(得分:2)
服务器以某种格式发送响应(比如XML),客户端想要 如果客户端发送像
这样的标题,则以其他格式(比如Json)响应
简而言之,有一个名为内容协商或 Conneg 的概念。您作为客户端使用HTTP标头(如Accept
,Accept-Language
,Accept-Encoding
等指定预期的内容类型,语言,编码等,并将该请求发送到服务器和服务器相应地回应。因此,如果您将Accept
标头设置为application/json
而服务器仅可以提供application/xml
内容类型,则会返回406 Not Acceptable
HTTP客户端错误。 基本上它表示我可能拥有您想要的资源,但没有所请求的代表。
如果您有权访问服务器代码,则可以通过弹簧将其转换为Data Transfer Object
或xml
的方式更改json
。只需使用@ResponseBody
为每个方法添加注释时,该方法的返回值可以通过默认的HttpMessageConverter
转换:
使用。将请求主体转换为方法参数 HttpMessageConverter。 HttpMessageConverter负责 从HTTP请求消息转换为对象并进行转换 从一个对象到HTTP响应体。该 RequestMappingHandlerAdapter支持@RequestBody注释 以下默认HttpMessageConverters:
- ByteArrayHttpMessageConverter转换字节数组。
- StringHttpMessageConverter转换字符串。
- FormHttpMessageConverter将表单数据转换为MultiValueMap或从MultiValueMap转换。
- SourceHttpMessageConverter转换为/来自javax.xml.transform.Source
此外,如果您将Jackson 2库添加到类路径中,MappingJackson2HttpMessageConverter
将负责转换为/从JSON转换。
但是,如果您无法访问服务器代码并且服务器仅提供XML,则唯一的选择是从服务器获取XML并手动将其转换为JSON。