Jestem zupełnie nowy w RestTemplate iw zasadzie w interfejsach API REST. Chcę odzyskać niektóre dane w mojej aplikacji za pośrednictwem Jira REST API, ale odzyskiwanie 401 Nieautoryzowane. Znaleziono i artykuł na temat dokumentacji jira rest api, ale tak naprawdę nie wiem, jak przepisać to do javy, ponieważ przykład używa linii poleceń z curl. Byłbym wdzięczny za wszelkie sugestie lub porady, jak przepisać:
curl -D- -X GET -H "Authorization: Basic ZnJlZDpmcmVk" -H "Content-Type: application/json" "http://kelpie9:8081/rest/api/2/issue/QA-31"
do javy za pomocą szablonu podpórki sprężynowej. Gdzie ZnJlZDpmcmVk to ciąg znaków nazwa użytkownika: hasło zakodowany algorytmem base64. Dziękuję Ci bardzo.
java
spring
resttemplate
jira-rest-api
Shippi
źródło
źródło
curl -u fred:fred
, nie ma potrzeby stosowania niezgrabnych ręcznych nagłówków. To samo dotyczy wiosny.Odpowiedzi:
Biorąc pod uwagę przykład na tej stronie , myślę, że byłby to najbardziej naturalny sposób na zrobienie tego, poprzez wypełnienie wartości nagłówka i przekazanie nagłówka do szablonu.
To ma wypełnić nagłówek
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);
A to jest przekazanie nagłówka do szablonu REST:
HttpEntity<String> request = new HttpEntity<String>(headers); ResponseEntity<Account> response = restTemplate.exchange(url, HttpMethod.GET, request, Account.class); Account account = response.getBody();
źródło
Możesz użyć RestTemplateBuilder z butami sprężynowymi
@Bean RestOperations rest(RestTemplateBuilder restTemplateBuilder) { return restTemplateBuilder.basicAuthentication("user", "password").build(); }
Zobacz dokumentację
(było przed SB 2.1.0
#basicAuthorization
)źródło
RestTemplate
.(może) najłatwiej bez importowania spring-boot.
restTemplate.getInterceptors().add(new BasicAuthorizationInterceptor("user", "password"));
źródło
exchange()
->doExecute()
, ->createRequest()
, ->InterceptingHttpAccessor.getRequestFactory()
(odRestTemplate
rozszerzeńInterceptingHttpAccessor
). Jeśli są przechwytywacze,getRequestFactory()
zwraca anInterceptingClientHttpRequestFactory
, co tworzyInterceptingClientHttpRequest
s. Rozszerzają one AbstractBufferingClientHttpRequest`, które konwertuje strumień wejściowy na bajt [] (w celu przekazania do przechwytywaczy). Tak więc InputStream nie jest w rzeczywistości przesyłany strumieniowo.Od Spring 5.1 możesz używać
HttpHeaders.setBasicAuth
Utwórz nagłówek Basic Authorization:
String username = "willie"; String password = ":p@ssword"; HttpHeaders headers = new HttpHeaders(); headers.setBasicAuth(username, password); ...other headers goes here...
Przekaż nagłówki do RestTemplate:
HttpEntity<String> request = new HttpEntity<String>(headers); ResponseEntity<Account> response = restTemplate.exchange(url, HttpMethod.GET, request, Account.class); Account account = response.getBody();
Dokumentacja: https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/http/HttpHeaders.html#setBasicAuth-java.lang.String-java.lang.String-
źródło
Referencyjna
TestRestTemplate
implementacja Spring Boot w następujący sposób:https://github.com/spring-projects/spring-boot/blob/v1.2.2.RELEASE/spring-boot/src/main/java/org/springframework/boot/test/TestRestTemplate.java
W szczególności zobacz poniższą metodę 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)); }
Podobnie można zrobić własny
RestTemplate
łatwoprzez dziedziczenie
TestRestTemplate
w następujący sposób:https://github.com/izeye/samples-spring-boot-branches/blob/rest-and-actuator-with-security/src/main/java/samples/springboot/util/BasicAuthRestTemplate.java
źródło
Istnieje wiele sposobów dodania podstawowego uwierzytelniania HTTP do
RestTemplate
.1. Dla pojedynczego wniosku
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(); }
Jeśli używasz Springa
5.1
lub nowszego, nie jest już wymagane ręczne ustawianie nagłówka autoryzacji.headers.setBasicAuth()
Zamiast tego użyj metody:// create headers HttpHeaders headers = new HttpHeaders(); headers.setBasicAuth("username", "password");
2. Dla grupy wniosków
@Service public class RestService { private final RestTemplate restTemplate; public RestService(RestTemplateBuilder restTemplateBuilder) { this.restTemplate = restTemplateBuilder .basicAuthentication("username", "password") .build(); } // use `restTemplate` instance here }
3. Na każdą prośbę
@Bean RestOperations restTemplateBuilder(RestTemplateBuilder restTemplateBuilder) { return restTemplateBuilder.basicAuthentication("username", "password").build(); }
Mam nadzieję, że to pomoże!
źródło
Zamiast tworzenia wystąpienia w następujący sposób:
TestRestTemplate restTemplate = new TestRestTemplate();
Po prostu zrób to w ten sposób:
TestRestTemplate restTemplate = new TestRestTemplate(user, password);
U mnie działa, mam nadzieję, że pomaga!
źródło
Służy
setBasicAuth
do definiowania poświadczeńHttpHeaders headers = new HttpHeaders(); headers.setBasicAuth("myUsername", myPassword);
Następnie utwórz żądanie, jak wolisz.
Przykład:
HttpEntity<String> request = new HttpEntity<String>(headers); ResponseEntity<String> response = restTemplate.exchange(url, HttpMethod.GET, request, String.class); String body = response.getBody();
źródło