使用Java + STS的API调用返回“内容类​​型'应用程序/八位字节流'不受支持”

时间:2018-06-01 22:59:18

标签: java spring rest api-design

我正在研究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?

希望我能够很好地解决我的问题,我已经深入研究了这一点,我仍在努力弄清楚发生了什么。

1 个答案:

答案 0 :(得分:0)

您是否使用jackson库或jaxb库进行编组/解组?

尝试使用@XmlRootElement注释Mono实体类,看看会发生什么。