Android 용 Spring RestTemplate으로 인증 된 POST 요청 만들기
Android 및 RestTemplate을 통해 연결하려는 RESTful API가 있습니다. API에 대한 모든 요청은 HttpEntity의 헤더를 설정 한 다음 RestTemplate의 exchange()
메서드 를 사용하여 HTTP 인증으로 인증됩니다 .
모든 GET 요청은 이러한 방식으로 훌륭하게 작동하지만 인증 된 POST 요청을 수행하는 방법을 알 수 없습니다. POST postForObject
를 postForEntity
처리하지만 인증 헤더를 설정하는 쉬운 방법이 없습니다.
따라서 GET의 경우 이것은 훌륭하게 작동합니다.
HttpAuthentication httpAuthentication = new HttpBasicAuthentication("username", "password");
HttpHeaders requestHeaders = new HttpHeaders();
requestHeaders.setAuthorization(httpAuthentication);
HttpEntity<?> httpEntity = new HttpEntity<Object>(requestHeaders);
MyModel[] models = restTemplate.exchange("/api/url", HttpMethod.GET, httpEntity, MyModel[].class);
그러나 POST exchange()
는 사용자 정의 헤더를 보내지 않고 .NET 을 사용하여 요청 본문을 설정하는 방법을 알지 못하기 때문에 분명히 작동 하지 않습니다 exchange()
.
RestTemplate에서 인증 된 POST 요청을 만드는 가장 쉬운 방법은 무엇입니까?
Ok가 답을 찾았습니다. exchange()
가장 좋은 방법입니다. 이상하게도 HttpEntity
클래스에는 setBody()
메서드 가 없지만 ( getBody()
) 생성자를 통해 요청 본문을 설정할 수 있습니다.
// Create the request body as a MultiValueMap
MultiValueMap<String, String> body = new LinkedMultiValueMap<String, String>();
body.add("field", "value");
// Note the body object as first parameter!
HttpEntity<?> httpEntity = new HttpEntity<Object>(body, requestHeaders);
MyModel model = restTemplate.exchange("/api/url", HttpMethod.POST, httpEntity, MyModel.class);
약간 다른 접근 방식 :
MultiValueMap<String, String> headers = new LinkedMultiValueMap<String, String>();
headers.add("HeaderName", "value");
headers.add("Content-Type", "application/json");
RestTemplate restTemplate = new RestTemplate();
restTemplate.getMessageConverters().add(new MappingJackson2HttpMessageConverter());
HttpEntity<ObjectToPass> request = new HttpEntity<ObjectToPass>(objectToPass, headers);
restTemplate.postForObject(url, request, ClassWhateverYourControllerReturns.class);
저는 최근에 Java에서 REST 호출을 수행하는 동안 과거 인증을 얻으려고 할 때 문제를 다루고 있었으며이 스레드 (및 다른 스레드)의 답변이 도움이되었지만 가져 오는 데 여전히 약간의 시행 착오가있었습니다. 일.
나를 위해 일한 것은 자격 증명을 인코딩 Base64
하고 기본 인증 헤더로 추가하는 것이 었습니다. 나는 다음로를 추가 HttpEntity
로 restTemplate.postForEntity
내게 필요한 응답을 준.
여기에 내가 작성한 클래스가 있습니다 (ResTemplate 확장).
public class AuthorizedRestTemplate extends RestTemplate{
private String username;
private String password;
public AuthorizedRestTemplate(String username, String password){
this.username = username;
this.password = password;
}
public String getForObject(String url, Object... urlVariables){
return authorizedRestCall(this, url, urlVariables);
}
private String authorizedRestCall(RestTemplate restTemplate,
String url, Object... urlVariables){
HttpEntity<String> request = getRequest();
ResponseEntity<String> entity = restTemplate.postForEntity(url,
request, String.class, urlVariables);
return entity.getBody();
}
private HttpEntity<String> getRequest(){
HttpHeaders headers = new HttpHeaders();
headers.add("Authorization", "Basic " + getBase64Credentials());
return new HttpEntity<String>(headers);
}
private String getBase64Credentials(){
String plainCreds = username + ":" + password;
byte[] plainCredsBytes = plainCreds.getBytes();
byte[] base64CredsBytes = Base64.encodeBase64(plainCredsBytes);
return new String(base64CredsBytes);
}
}
Very useful I had a slightly different scenario where I the request xml was itself the body of the POST and not a param. For that the following code can be used - Posting as an answer just in case anyone else having similar issue will benefit.
final HttpHeaders headers = new HttpHeaders();
headers.add("header1", "9998");
headers.add("username", "xxxxx");
headers.add("password", "xxxxx");
headers.add("header2", "yyyyyy");
headers.add("header3", "zzzzz");
headers.setContentType(MediaType.APPLICATION_XML);
headers.setAccept(Arrays.asList(MediaType.APPLICATION_XML));
final HttpEntity<MyXmlbeansRequestDocument> httpEntity = new HttpEntity<MyXmlbeansRequestDocument>(
MyXmlbeansRequestDocument.Factory.parse(request), headers);
final ResponseEntity<MyXmlbeansResponseDocument> responseEntity = restTemplate.exchange(url, HttpMethod.POST, httpEntity,MyXmlbeansResponseDocument.class);
log.info(responseEntity.getBody());
ReferenceURL : https://stackoverflow.com/questions/10358345/making-authenticated-post-requests-with-spring-resttemplate-for-android
'program story' 카테고리의 다른 글
Android-Facebook, Twitter, Mail, ecc에서 공유 (0) | 2020.12.27 |
---|---|
Android 애플리케이션에서 현재 시간대 가져 오기 (0) | 2020.12.27 |
Pandas에서 이름별로 열을 테이블 앞으로 이동 (0) | 2020.12.27 |
PHP에서 숫자와 같은 문자를 증가시키는 방법은 무엇입니까? (0) | 2020.12.27 |
int8_t, int_least8_t 및 int_fast8_t의 차이점은 무엇입니까? (0) | 2020.12.27 |