我正在研究API的一部分,它需要调用另一个外部API来检索其中一个函数的数据。该调用返回HTTP 500错误,描述“内容类型'应用程序/八位字节流'不受支持。”该调用预计会返回一种'application / json。'
我发现这是因为收到的响应没有在其标题中明确指定内容类型,即使其内容格式为JSON,因此我的API默认假设它是一个八位字节流。
问题是,我不知道如何调整。即使其他API没有指定内容类型,我如何让我的API将其从其他API接收的数据视为application / json?更改其他API以在其响应中包含contenttype属性是不可行的。
代码:
API类:
@RestController
@RequestMapping(path={Constants.API_DISPATCH_PROFILE_CONTEXT_PATH},produces = {MediaType.APPLICATION_JSON_VALUE})
public class GetProfileApi {
@Autowired
private GetProfile GetProfile;
@GetMapping(path = {"/{id}"})
public Mono<GetProfileResponse> getProfile(@Valid @PathVariable String id){
return GetProfile.getDispatchProfile(id);
}
调用外部API的服务:
@Autowired
private RestClient restClient;
@Value("${dispatch.api.get_profile}")
private String getDispatchProfileUrl;
@Override
public Mono<GetProfileResponse> getDispatchProfile(String id) {
return Mono.just(id)
.flatMap(aLong -> {
MultiValueMap<String, String> headers = new HttpHeaders();
headers.add(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE);
return restClient.get(getDispatchProfileUrl, headers);
}).flatMap(clientResponse -> {
HttpStatus status = clientResponse.statusCode();
log.info("HTTP Status : {}", status.value());
return clientResponse.bodyToMono(GetProfileClientResponse.class);
// the code does not get past the above line before returning the error
}).map(GetProfileClientResponse -> {
log.debug("Response : {}",GetProfileClientResponse);
String id = GetProfileClientResponse.getId();
log.info("SubscriberResponse Code : {}",id);
return GetProfileResponse.builder()
// builder call to be completed later
.build();
});
}
RestClient的GET方法:
public <T> Mono<ClientResponse> get(String baseURL, MultiValueMap<String,String> headers){
log.info("Executing REST GET method for URL : {}",baseURL);
WebClient client = WebClient.builder()
.baseUrl(baseURL)
.defaultHeaders(httpHeaders -> httpHeaders.addAll(headers))
.build();
return client.get()
.exchange();
}
我尝试过的一个解决方案是将produces= {MediaType.APPLICATION_JSON_VALUE}
中的@RequestMapping
设置为produces= {MediaType.APPLICATION_OCTET_STREAM_VALUE}
,但这会导致不同的错误,HTTP 406无法接受。我发现服务器无法向客户端提供所请求的表示中的数据,但我无法弄清楚如何纠正它。
即使没有内容类型,我怎么能成功地将响应视为JSON?
希望我能够很好地解决我的问题,我已经深入研究了这一点,我仍在努力弄清楚发生了什么。
答案 0 :(得分:0)
您是否使用jackson库或jaxb库进行编组/解组?
尝试使用@XmlRootElement注释Mono实体类,看看会发生什么。