我们有一个使用 Spring Boot 实现的 REST API(服务器端)。此 API 正在流式传输 PDF 文件StreamingResponseBody
,ResponseEntity
其内容类型为MediaType.APPLICATION_OCTET_STREAM
.
我正在尝试在RestTemplate
. 这个客户端应用程序又是一个 Spring Boot 应用程序。此客户端应用程序已存在,并且MappingJackson2HttpMessageConverter
到目前为止支持两种支持媒体类型。
application/json
和application/x-www-form-urlencoded
我遵循了一些建议并尝试了这些项目
- 添加
MediaType.APPLICATION_OCTET_STREAM
到现有的MappingJackson2HttpMessageConverter
- 添加
ByteArrayHttpMessageConverter
了默认支持MediaType.APPLICATION_OCTET_STREAM
- 添加
ResourceHttpMessageConverter
了哪些支持流式响应。
但是有了所有这些建议,我面临以下错误。目前,我不确定配置中是否缺少任何内容。团队,如果您可以将我重定向到实现此集成的简短示例或解决方案,那将非常有帮助。
org.springframework.web.client.RestClientException: Error while extracting response for type [interface org.springframework.web.servlet.mvc.method.annotation.StreamingResponseBody] and content type [application/octet-stream]; nested exception is org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Unexpected character ('%' (code 37)): expected a valid value (JSON String, Number, Array, Object or token 'null', 'true' or 'false'); nested exception is com.fasterxml.jackson.core.JsonParseException: Unexpected character ('%' (code 37)): expected a valid value (JSON String, Number, Array, Object or token 'null', 'true' or 'false') at [Source: (PushbackInputStream); line: 1, column: 2]
当我尝试使用ByteArrayHttpMessageConverter
(或)时出现以下错误ResourceHttpMessageConverter
org.springframework.web.client.RestClientException: Could not extract response: no suitable HttpMessageConverter found for response type [interface org.springframework.web.servlet.mvc.method.annotation.StreamingResponseBody] and content type [application/octet-stream]
at org.springframework.web.client.HttpMessageConverterExtractor.extractData(HttpMessageConverterExtractor.java:123) ~[spring-web-5.2.6.RELEASE.jar!/:5.2.6.RELEASE]
使用当前实现更新问题: 这就是我正在创建的 resttemplate bean。
@Bean
public RestTemplate restTemplate() {
final RestTemplate restTemplate = new RestTemplate(httpRequestFactory());
final List<HttpMessageConverter<?>> messageConverters = new ArrayList<>();
final MappingJackson2HttpMessageConverter converter = new
MappingJackson2HttpMessageConverter();
final List<MediaType> mediaTypes = new ArrayList<>();
mediaTypes.add(MediaType.APPLICATION_JSON);
mediaTypes.add(MediaType.APPLICATION_FORM_URLENCODED);
//mediaTypes.add(MediaType.APPLICATION_OCTET_STREAM)
converter.setSupportedMediaTypes(mediaTypes);
messageConverters.add(converter);
restTemplate.setMessageConverters(messageConverters);
return restTemplate;
}
我的 API 客户端调用是
ResponseEntity<StreamingResponseBody> response = reportRestTemplate.exchange(builder.buildAndExpand(uriParams).toUriString(),HttpMethod.GET,entity,StreamingResponseBody.class,uriParams);