104

我是 RestTemplate 的新手,基本上也是 REST API 的新手。我想通过 Jira REST API 在我的应用程序中检索一些数据,但返回 401 Unauthorized。在jira rest api 文档上找到和文章,但不知道如何将其重写为 java,因为该示例使用 curl 的命令行方式。我将不胜感激任何关于如何重写的建议或建议:

curl -D- -X GET -H "Authorization: Basic ZnJlZDpmcmVk" -H "Content-Type: application/json" "http://kelpie9:8081/rest/api/2/issue/QA-31"

使用spring rest模板进入java。其中 ZnJlZDpmcmVk 是用户名:密码的 base64 编码字符串。非常感谢。

4

9 回答 9

180

取自本网站上的示例,我认为这将是最自然的方法,即填写标头值并将标头传递给模板。

这是填写标题Authorization

String plainCreds = "willie:p@ssword";
byte[] plainCredsBytes = plainCreds.getBytes();
byte[] base64CredsBytes = Base64.encodeBase64(plainCredsBytes);
String base64Creds = new String(base64CredsBytes);

HttpHeaders headers = new HttpHeaders();
headers.add("Authorization", "Basic " + base64Creds);

这是将标头传递给 REST 模板:

HttpEntity<String> request = new HttpEntity<String>(headers);
ResponseEntity<Account> response = restTemplate.exchange(url, HttpMethod.GET, request, Account.class);
Account account = response.getBody();
于 2014-02-20T21:50:53.703 回答
113

您可以使用 spring-boot RestTemplateBuilder

@Bean
RestOperations rest(RestTemplateBuilder restTemplateBuilder) {
    return restTemplateBuilder.basicAuthentication("user", "password").build();
}

查看文档

(在 SB 2.1.0 之前是#basicAuthorization

于 2017-06-05T13:48:24.783 回答
35

有多种方法可以将基本 HTTP 身份验证添加到RestTemplate.

1.对于单个请求

try {
    // request url
    String url = "https://jsonplaceholder.typicode.com/posts";

    // create auth credentials
    String authStr = "username:password";
    String base64Creds = Base64.getEncoder().encodeToString(authStr.getBytes());

    // create headers
    HttpHeaders headers = new HttpHeaders();
    headers.add("Authorization", "Basic " + base64Creds);

    // create request
    HttpEntity request = new HttpEntity(headers);

    // make a request
    ResponseEntity<String> response = new RestTemplate().exchange(url, HttpMethod.GET, request, String.class);

    // get JSON response
    String json = response.getBody();

} catch (Exception ex) {
    ex.printStackTrace();
}

如果您使用的是 Spring5.1或更高版本,则不再需要手动设置授权标头。改用headers.setBasicAuth()方法:

// create headers
HttpHeaders headers = new HttpHeaders();
headers.setBasicAuth("username", "password");

2.对于一组请求

@Service
public class RestService {

    private final RestTemplate restTemplate;

    public RestService(RestTemplateBuilder restTemplateBuilder) {
        this.restTemplate = restTemplateBuilder
                .basicAuthentication("username", "password")
                .build();
    }

   // use `restTemplate` instance here
}

3. 对于每一个请求

@Bean
RestOperations restTemplateBuilder(RestTemplateBuilder restTemplateBuilder) {
    return restTemplateBuilder.basicAuthentication("username", "password").build();
}

我希望它有帮助!

于 2019-09-21T13:06:31.970 回答
28

从 Spring 5.1 开始,您可以使用HttpHeaders.setBasicAuth

创建基本授权标头:

String username = "willie";
String password = ":p@ssword";
HttpHeaders headers = new HttpHeaders();
headers.setBasicAuth(username, password);
...other headers goes here...

将标头传递给 RestTemplate:

HttpEntity<String> request = new HttpEntity<String>(headers);
ResponseEntity<Account> response = restTemplate.exchange(url, HttpMethod.GET, request, Account.class);
Account account = response.getBody();

文档: https ://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/http/HttpHeaders.html#setBasicAuth-java.lang.String-java.lang.String-

于 2018-11-20T14:16:02.033 回答
25

(也许)不导入 spring-boot 的最简单方法。

restTemplate.getInterceptors().add(new BasicAuthorizationInterceptor("user", "password"));
于 2018-03-15T11:11:58.193 回答
17

参考Spring Boot的TestRestTemplate实现如下:

https://github.com/spring-projects/spring-boot/blob/v1.2.2.RELEASE/spring-boot/src/main/java/org/springframework/boot/test/TestRestTemplate.java

特别是 addAuthentication() 方法如下:

private void addAuthentication(String username, String password) {
    if (username == null) {
        return;
    }
    List<ClientHttpRequestInterceptor> interceptors = Collections
            .<ClientHttpRequestInterceptor> singletonList(new BasicAuthorizationInterceptor(
                    username, password));
    setRequestFactory(new InterceptingClientHttpRequestFactory(getRequestFactory(),
            interceptors));
}

RestTemplate同样,您可以轻松制作自己的

通过继承TestRestTemplate如下:

https://github.com/izeye/samples-spring-boot-branches/blob/rest-and-actuator-with-security/src/main/java/samples/springboot/util/BasicAuthRestTemplate.java

于 2015-03-11T07:54:36.450 回答
6

而不是如下实例化:

TestRestTemplate restTemplate = new TestRestTemplate();

这样做:

TestRestTemplate restTemplate = new TestRestTemplate(user, password);

它对我有用,我希望它有帮助!

于 2016-01-22T13:14:43.477 回答
1

用于setBasicAuth定义凭据

HttpHeaders headers = new HttpHeaders();
headers.setBasicAuth("myUsername", myPassword);

然后根据您的喜好创建请求。

例子:

HttpEntity<String> request = new HttpEntity<String>(headers);
ResponseEntity<String> response = restTemplate.exchange(url, HttpMethod.GET, 
request, String.class);
String body = response.getBody();
于 2020-09-10T18:00:53.053 回答
0
HttpHeaders headers = new HttpHeaders();
        headers.setBasicAuth(username, password);

然后继续此处其他人提到的相同程序:

HttpEntity<String> request = new HttpEntity<String>(headers);
ResponseEntity<String> response = restTemplate.exchange(url, HttpMethod.GET, 
request, String.class);
于 2021-11-18T08:38:06.807 回答