Spring boot RestTemplate调用返回401个未经授权的

Spring boot RestTemplate调用返回401个未经授权的,spring-boot,ibm-cloud,resttemplate,apache-commons-httpclient,Spring Boot,Ibm Cloud,Resttemplate,Apache Commons Httpclient,背景 我试图使用restemplate从我的SpringBoot应用程序中使用托管在ibmcloudapi上的REST端点。我正在使用以下代码片段进行调用: RestTemplate send = new RestTemplate(); HttpHeaders headers = new HttpHeaders(); headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON)); headers.setCont

背景

我试图使用
restemplate
从我的SpringBoot应用程序中使用托管在ibmcloudapi上的REST端点。我正在使用以下代码片段进行调用:

RestTemplate send = new RestTemplate();

HttpHeaders headers = new HttpHeaders();
headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON));
headers.setContentType(MediaType.APPLICATION_JSON);
headers.setCacheControl(CacheControl.noCache());
headers.set("x-ibm-client-id", clientId);
headers.set("x-ibm-client-secret", clientSecret);

HttpEntity<BodyEntity> httpEntity = new HttpEntity<>(bodyEntity, headers);

send.exchange(ENDPOINT_URL, HttpMethod.POST, httpEntity, Object.class);
问题

使用这个片段,当我打电话时,我收到401个未经授权的消息。当我使用邮递员拨打相同的电话时,我从服务器收到了正确的响应,没有任何问题

因为我收到了401响应代码,所以我设置通过记录请求的头、主体和其他部分来进一步调查请求

我实现了
ClientHttpRequestInterceptor
来记录传出请求以进一步调试问题,并将此拦截器添加到我的RestTemplate配置中,如下所示:

@Bean
public RestTemplate restTemplate(RestTemplateBuilder builder) {
    // new code
    builder.interceptors(new LoggingClientHttpRequestInterceptor());
    return builder.build();
}
CloseableHttpClient httpClient = HttpClients.createDefault();
HttpPost httpPost = new HttpPost(URL);

String reqString = "BODY";
httpPost.setEntity(new StringEntity(reqString, ContentType.APPLICATION_JSON));

httpPost.setHeader("accept", "application/json");
httpPost.setHeader("content-type", "application/json");
httpPost.setHeader("cache-control", "no-cache");
httpPost.setHeader("x-ibm-client-id", clientId);
httpPost.setHeader("x-ibm-client-secret", clientSecret);

CloseableHttpResponse response = httpClient.execute(httpPost);

try {
    System.out.println("Response status: " + response.getStatusLine());
    HttpEntity entity1 = response.getEntity();
    System.out.println("Response :" + entity1.toString());
} finally {
    response.close();
}
再次提出请求后,我可以在日志中看到传出呼叫包含了所有应该包含的详细信息,例如标题和正文是正确的

在此之后,我将整个过程更改为使用Apache HTTP客户端,如下所示:

@Bean
public RestTemplate restTemplate(RestTemplateBuilder builder) {
    // new code
    builder.interceptors(new LoggingClientHttpRequestInterceptor());
    return builder.build();
}
CloseableHttpClient httpClient = HttpClients.createDefault();
HttpPost httpPost = new HttpPost(URL);

String reqString = "BODY";
httpPost.setEntity(new StringEntity(reqString, ContentType.APPLICATION_JSON));

httpPost.setHeader("accept", "application/json");
httpPost.setHeader("content-type", "application/json");
httpPost.setHeader("cache-control", "no-cache");
httpPost.setHeader("x-ibm-client-id", clientId);
httpPost.setHeader("x-ibm-client-secret", clientSecret);

CloseableHttpResponse response = httpClient.execute(httpPost);

try {
    System.out.println("Response status: " + response.getStatusLine());
    HttpEntity entity1 = response.getEntity();
    System.out.println("Response :" + entity1.toString());
} finally {
    response.close();
}
使用上面的代码片段,我执行了请求并收到了正确的响应

问题

为什么RestTemplate调用返回错误,而HttpClient返回正确的响应? 我需要进一步配置RestTemplate吗? 我错过了什么