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吗?
我错过了什么