programing

Android용 Spring Rest Template로 인증된 POST 요청 만들기

javajsp 2023. 8. 7. 22:21

Android용 Spring Rest Template로 인증된 POST 요청 만들기

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

모든 GET 요청은 이러한 방식으로 잘 작동하지만 인증된 POST 요청을 수행하는 방법을 알 수 없습니다.postForObject그리고.postForEntityPOST를 처리하지만 인증 헤더를 쉽게 설정할 수 없습니다.

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 요청을 만드는 가장 쉬운 방법은 무엇입니까?

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);

ResponseEntity<MyModel> response = 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제가 필요로 하는 반응을 보여줬죠

다음은 전체(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);
    }
}

매우 유용했습니다. 요청 xml이 파라미터가 아닌 POST 본문인 경우에는 약간 다른 시나리오가 있었습니다.이를 위해 다음 코드를 사용할 수 있습니다 - 유사한 문제가 있는 다른 사람이 혜택을 받을 경우를 대비하여 답변으로 게시합니다.

    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());

언급URL : https://stackoverflow.com/questions/10358345/making-authenticated-post-requests-with-spring-resttemplate-for-android