복붙노트

[SPRING] Android 용 Spring RestTemplate을 사용하여 인증 된 POST 요청 만들기

SPRING

Android 용 Spring RestTemplate을 사용하여 인증 된 POST 요청 만들기

Android 및 RestTemplate을 통해 연결하려고하는 RESTful API가 있습니다. API에 대한 모든 요청은 HttpEntity의 헤더를 설정 한 다음 RestTemplate의 exchange () 메소드를 사용하여 HTTP 인증으로 인증됩니다.

모든 GET 요청은이 방법으로 훌륭하게 작동하지만 인증 된 POST 요청을 수행하는 방법을 파악할 수 없습니다. postForObject 및 postForEntity는 POST를 처리하지만 인증 헤더를 설정하는 쉬운 방법이 없습니다.

그래서 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 ()에서 사용자 정의 된 헤더를 보내지 않으므로 분명히 작동하지 않으며 exchange ()를 사용하여 요청 본문을 설정하는 방법을 알지 못합니다.

RestTemplate에서 인증 된 POST 요청을하는 가장 쉬운 방법은 무엇입니까?

해결법

  1. ==============================

    1.좋아, 대답을 찾았 어. exchange ()가 최선의 방법입니다. 이상하게도 HttpEntity 클래스에는 setBody () 메소드 (getBody ()가 있음)가 없지만 생성자를 통해 요청 본문을 설정할 수 있습니다.

    좋아, 대답을 찾았 어. 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);
    
  2. ==============================

    2.약간 다른 접근 방식 :

    약간 다른 접근 방식 :

    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);
    
  3. ==============================

    3.최근 Java에서 REST 호출을하는 동안 과거의 인증을 얻으려고 할 때 문제를 다루었으며이 스레드 (및 다른 스레드)의 응답이 도움이되었지만 가져 오기에 관련된 시행 착오가 여전히있었습니다. 일.

    최근 Java에서 REST 호출을하는 동안 과거의 인증을 얻으려고 할 때 문제를 다루었으며이 스레드 (및 다른 스레드)의 응답이 도움이되었지만 가져 오기에 관련된 시행 착오가 여전히있었습니다. 일.

    나를 위해 일한 것은 Base64에서 자격 증명을 인코딩하고 기본 인증 헤더로 추가하는 것이 었습니다. 그런 다음 restTemplate.postForEntity에 HttpEntity로 추가하여 필요한 응답을 받았습니다.

    다음은 내가 이것을 위해 작성한 클래스입니다 (RestTemplate 확장).

    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);
        }
    }
    
  4. ==============================

    4.굉장히 유용하다 약간의 시나리오가 있는데, 여기서 xml 요청 자체는 POST의 본문이지 param이 아닙니다. 그 때문에 다음과 같은 코드를 사용할 수 있습니다. 비슷한 문제를 가진 사람이 도움이 될 경우를 대비해 답변으로 게시하십시오.

    굉장히 유용하다 약간의 시나리오가 있는데, 여기서 xml 요청 자체는 POST의 본문이지 param이 아닙니다. 그 때문에 다음과 같은 코드를 사용할 수 있습니다. 비슷한 문제를 가진 사람이 도움이 될 경우를 대비해 답변으로 게시하십시오.

        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());
    
  5. from https://stackoverflow.com/questions/10358345/making-authenticated-post-requests-with-spring-resttemplate-for-android by cc-by-sa and MIT license