Я совершенно новичок в RestTemplate и в основном в API REST. Я хочу получить некоторые данные в своем приложении через 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"
в Java с помощью шаблона пружинной опоры. Где ZnJlZDpmcmVk - это строка имени пользователя: пароль в кодировке base64. Большое спасибо.
curl -u fred:fred
, нет необходимости в неуклюжих заголовках вручную. То же самое и с Spring.Ответы:
Взято из примера на этом сайте , я думаю, что это был бы наиболее естественный способ сделать это, заполнив значение заголовка и передав заголовок в шаблон.
Это для заполнения шапки
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();
источник
Вы можете использовать RestTemplateBuilder с весенней загрузкой
@Bean RestOperations rest(RestTemplateBuilder restTemplateBuilder) { return restTemplateBuilder.basicAuthentication("user", "password").build(); }
См. Документацию
(до СБ 2.1.0 было
#basicAuthorization
)источник
RestTemplate
.(возможно) самый простой способ без импорта spring -boot.
restTemplate.getInterceptors().add(new BasicAuthorizationInterceptor("user", "password"));
источник
exchange()
->doExecute()
, ->createRequest()
, ->InterceptingHttpAccessor.getRequestFactory()
(посколькуRestTemplate
расширяетсяInterceptingHttpAccessor
). Если есть перехватчики,getRequestFactory()
возвращаетInterceptingClientHttpRequestFactory
, что создаетInterceptingClientHttpRequest
s. Они расширяют AbstractBufferingClientHttpRequest`, который преобразует входной поток в byte [] (для передачи перехватчикам). Итак, InputStream на самом деле не передается.Начиная с 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-
источник
Ссылка на
TestRestTemplate
реализацию Spring Boot выглядит следующим образом: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
источник
Есть несколько способов добавить базовую 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(); }
Если вы используете Spring
5.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(); }
Я надеюсь, что это помогает!
источник
Вместо создания следующего экземпляра:
TestRestTemplate restTemplate = new TestRestTemplate();
Просто сделайте это так:
TestRestTemplate restTemplate = new TestRestTemplate(user, password);
У меня работает, надеюсь поможет!
источник
Используйте
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();
источник