我在 Spring 4 中使用以下内容通过 RestTemplate 检索 JSON:
protected DocInfoResponse retrieveData(String urlWithAuth) {
RestTemplate restTemplate = new RestTemplate();
HttpHeaders headers = new HttpHeaders();
headers.add("Authorization", "Basic " + auth.getSig());
HttpEntity<String> request = new HttpEntity<String>(headers);
ResponseEntity<DocInfoResponse> response = restTemplate.exchange(urlWithAuth, HttpMethod.GET, request, DocInfoResponse.class);
return response.getBody();
}
我使用相同的代码(具有不同的响应类)从同一站点成功获取 JSON 文档(使用不同的参数获取不同的文档)。
当我执行上述代码时,我收到以下堆栈跟踪(部分):
Caused by: org.springframework.web.client.HttpClientErrorException: 401 Unauthorized
at
org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:91) ~[spring-web-4.3.7.RELEASE.jar:4.3.7.RELEASE]
谁能指出我为什么会收到异常?
最佳答案
我发现上面最初发布的问题是由于 auth
参数上发生双重加密造成的。我通过使用 UriComponentsBuilder
并在 exchange()
上显式调用 encode()
解决了这个问题。
SyncResponse retrieveData(UriComponentsBuilder builder) {
RestTemplate restTemplate = new RestTemplate();
HttpHeaders headers = new HttpHeaders();
headers.set("Accept", MediaType.APPLICATION_JSON_VALUE);
HttpEntity<String> request = new HttpEntity<String>(headers);
ResponseEntity<SyncResponse> response = restTemplate.exchange(builder.build().encode().toUri(), HttpMethod.GET, request, SyncResponse.class);
return response.getBody();
}
我的 UriComponentsBuilder
是使用以下方式构建的:
UriComponentsBuilder buildUrl(String urlString) {
UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(urlString);
return auth.appendAuth(builder);
}
(auth.appendAuth()
在 urlString
中添加目标服务所需的附加 .queryParams()
。)
执行此操作的调用是 retrieveData(buildUrl(urlString));
。
关于Spring RestTemplate 收到 "401 Unauthorized",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42741220/