program story

Android 용 Spring RestTemplate으로 인증 된 POST 요청 만들기

inputbox 2020. 12. 27. 10:49
반응형

Android 용 Spring RestTemplate으로 인증 된 POST 요청 만들기


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

모든 GET 요청은 이러한 방식으로 훌륭하게 작동하지만 인증 된 POST 요청을 수행하는 방법을 알 수 없습니다. POST postForObjectpostForEntity처리하지만 인증 헤더를 설정하는 쉬운 방법이 없습니다.

따라서 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하고 기본 인증 헤더로 추가하는 것이 었습니다. 나는 다음로를 추가 HttpEntityrestTemplate.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

반응형