Ich bin völlig neu in RestTemplate und im Grunde auch in den REST-APIs. Ich möchte einige Daten in meiner Anwendung über die Jira REST-API abrufen, aber 401 Unauthorized zurückerhalten. Gefunden und Artikel über Jira Rest API-Dokumentation, aber ich weiß nicht wirklich, wie ich dies in Java umschreiben soll, da das Beispiel die Befehlszeilenmethode mit Curl verwendet. Ich würde mich über jeden Vorschlag oder Rat zum Umschreiben freuen:
curl -D- -X GET -H "Authorization: Basic ZnJlZDpmcmVk" -H "Content-Type: application/json" "http://kelpie9:8081/rest/api/2/issue/QA-31"
in Java mit Spring Rest Vorlage. Wobei ZnJlZDpmcmVk eine base64-codierte Zeichenfolge mit dem Benutzernamen: password ist. Vielen Dank.
java
spring
resttemplate
jira-rest-api
Shippi
quelle
quelle
curl -u fred:fred
, ohne dass umständliche manuelle Header erforderlich sind. Gleiches gilt für den Frühling.Antworten:
Aus dem Beispiel auf dieser Site geht hervor , dass dies der natürlichste Weg ist, indem Sie den Header-Wert eingeben und den Header an die Vorlage übergeben.
Dies ist, um die Überschrift auszufüllen
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);
Und das ist, um den Header an die REST-Vorlage zu übergeben:
HttpEntity<String> request = new HttpEntity<String>(headers); ResponseEntity<Account> response = restTemplate.exchange(url, HttpMethod.GET, request, Account.class); Account account = response.getBody();
quelle
Sie können Spring-Boot RestTemplateBuilder verwenden
@Bean RestOperations rest(RestTemplateBuilder restTemplateBuilder) { return restTemplateBuilder.basicAuthentication("user", "password").build(); }
Siehe Dokumentation
(vor SB 2.1.0 war es
#basicAuthorization
)quelle
RestTemplate
.(vielleicht) der einfachste Weg ohne Spring-Boot zu importieren.
restTemplate.getInterceptors().add(new BasicAuthorizationInterceptor("user", "password"));
quelle
exchange()
->doExecute()
, ->createRequest()
, ->InterceptingHttpAccessor.getRequestFactory()
(daRestTemplate
verlängertInterceptingHttpAccessor
). Wenn es InterceptorsgetRequestFactory()
gibt, wird ein zurückgegebenInterceptingClientHttpRequestFactory
, wodurchInterceptingClientHttpRequest
s erstellt wird . Diese erweitern AbstractBufferingClientHttpRequest`, das den Eingabestream in ein Byte [] konvertiert (zur Übergabe an die Interceptors). Ein InputStream wird also nicht wirklich gestreamt.Ab Spring 5.1 können Sie verwenden
HttpHeaders.setBasicAuth
Erstellen Sie den Header für die Basisautorisierung:
String username = "willie"; String password = ":p@ssword"; HttpHeaders headers = new HttpHeaders(); headers.setBasicAuth(username, password); ...other headers goes here...
Übergeben Sie die Header an die RestTemplate:
HttpEntity<String> request = new HttpEntity<String>(headers); ResponseEntity<Account> response = restTemplate.exchange(url, HttpMethod.GET, request, Account.class); Account account = response.getBody();
Dokumentation: https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/http/HttpHeaders.html#setBasicAuth-java.lang.String-java.lang.String-
quelle
Verweisen Sie
TestRestTemplate
wie folgt auf die Implementierung von 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
Beachten Sie insbesondere die Methode addAuthentication () wie folgt:
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)); }
Ebenso können Sie ganz
RestTemplate
einfach Ihre eigenen erstellendurch Vererbung wie
TestRestTemplate
folgt:https://github.com/izeye/samples-spring-boot-branches/blob/rest-and-actuator-with-security/src/main/java/samples/springboot/util/BasicAuthRestTemplate.java
quelle
Es gibt mehrere Möglichkeiten, die grundlegende HTTP-Authentifizierung zum hinzuzufügen
RestTemplate
.1. Für eine einzelne Anfrage
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(); }
Wenn Sie Spring
5.1
oder höher verwenden, muss der Berechtigungsheader nicht mehr manuell festgelegt werden. Verwenden Sieheaders.setBasicAuth()
stattdessen die Methode:// create headers HttpHeaders headers = new HttpHeaders(); headers.setBasicAuth("username", "password");
2. Für eine Gruppe von Anfragen
@Service public class RestService { private final RestTemplate restTemplate; public RestService(RestTemplateBuilder restTemplateBuilder) { this.restTemplate = restTemplateBuilder .basicAuthentication("username", "password") .build(); } // use `restTemplate` instance here }
3. Für jede Anfrage
@Bean RestOperations restTemplateBuilder(RestTemplateBuilder restTemplateBuilder) { return restTemplateBuilder.basicAuthentication("username", "password").build(); }
Ich hoffe, es hilft!
quelle
Anstatt wie folgt zu instanziieren:
TestRestTemplate restTemplate = new TestRestTemplate();
Mach es einfach so:
TestRestTemplate restTemplate = new TestRestTemplate(user, password);
Es funktioniert bei mir, ich hoffe es hilft!
quelle
Verwenden Sie
setBasicAuth
diese Option, um Anmeldeinformationen zu definierenHttpHeaders headers = new HttpHeaders(); headers.setBasicAuth("myUsername", myPassword);
Erstellen Sie dann die Anfrage nach Ihren Wünschen.
Beispiel:
HttpEntity<String> request = new HttpEntity<String>(headers); ResponseEntity<String> response = restTemplate.exchange(url, HttpMethod.GET, request, String.class); String body = response.getBody();
quelle