Spring RestTemplate 收到 "401 Unauthorized"

标签 spring spring-boot resttemplate spring-rest

我在 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/

相关文章:

java - 如何通过Spring setter注入(inject)设置JFrame的大小?

java - 保存时双向 OneToMany 和 ManyToOne 返回 "NULL not allowed for column"

spring-boot - Spring Boot Microservice调用Web API

java - Spring分页

java - 将 CAS 与自定义登录页面一起使用

java - 由于 sql 错误 java.sql.SQLException : Invalid value for getInt()?,无法从我的表中获取数据

java - 如何对多个实体使用单个 JPA 规范类和方法

java - CURL 中的 -u 是什么意思以及如何使用带有 -u 的restTemplate 来发布请求

java - Spring Rest 模板中未知的 mime 类型?

java - 浏览器和 postman 返回结果,但 Resttemplate 由于 %26 返回 0 个结果