Spring restTemplate을 사용한 REST API의 기본 인증
나는 RestTemplate과 기본적으로 REST API에서도 완전히 새로운 것입니다. Jira REST API를 통해 내 애플리케이션에서 일부 데이터를 검색하고 싶지만 401 Unauthorised를 되찾고 싶습니다. jira rest api 문서 에 대한 기사를 찾았 지만 예제에서는 curl과 함께 명령 줄 방식을 사용하므로이를 Java로 다시 작성하는 방법을 모릅니다. 다시 작성하는 방법에 대한 제안이나 조언을 주시면 감사하겠습니다.
curl -D- -X GET -H "Authorization: Basic ZnJlZDpmcmVk" -H "Content-Type: application/json" "http://kelpie9:8081/rest/api/2/issue/QA-31"
스프링 나머지 템플릿을 사용하여 자바로. 여기서 ZnJlZDpmcmVk는 사용자 이름 : 암호의 base64 인코딩 문자열입니다. 대단히 감사합니다.
이 사이트 의 예제에서 가져온 헤더 값을 채우고 헤더를 템플릿에 전달하는 것이 가장 자연스러운 방법이라고 생각합니다.
이것은 헤더를 채우는 것입니다 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();
spring-boot RestTemplateBuilder를 사용할 수 있습니다.
@Bean
RestOperations rest(RestTemplateBuilder restTemplateBuilder) {
return restTemplateBuilder.basicAuthentication("user", "password").build();
}
문서 보기
(SB 2.1.0 이전에는 #basicAuthorization
)
(아마도) spring-boot를 가져 오지 않는 가장 쉬운 방법입니다.
restTemplate.getInterceptors().add(new BasicAuthorizationInterceptor("user", "password"));
TestRestTemplate
다음과 같이 Spring Boot의 구현을 참조하십시오 .
특히 다음과 같이 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
다음과 같이 상속 으로 :
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();
다음과 같이 인스턴스화하는 대신 :
TestRestTemplate restTemplate = new TestRestTemplate();
다음과 같이하십시오.
TestRestTemplate restTemplate = new TestRestTemplate(user, password);
그것은 나를 위해 작동합니다, 나는 그것이 도움이되기를 바랍니다!
.NET Framework에 기본 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();
}
도움이 되었기를 바랍니다.
'programing tip' 카테고리의 다른 글
PHP : 예외를 포착하고 실행을 계속할 수 있습니까? (0) | 2020.11.19 |
---|---|
전체 단어를 고려하여 문자열에서 처음 100 자 가져 오기 (0) | 2020.11.19 |
ROR의 특정 필드에 고유 한 값이있는 레코드 수를 어떻게 계산할 수 있습니까? (0) | 2020.11.19 |
ModelState.IsValid가 실패하면 오류 메시지가 표시됩니까? (0) | 2020.11.19 |
NSString에 대한 열거 형 값 (iOS) (0) | 2020.11.19 |