복붙노트

[SPRING] Spring RestTemplate으로 폼 데이터를 POST하는 방법?

SPRING

Spring RestTemplate으로 폼 데이터를 POST하는 방법?

다음 (작동 중) 컬 조각을 RestTemplate 호출로 변환하고 싶습니다.

curl -i -X POST -d "email=first.last@example.com" https://app.example.com/hr/email

전자 메일 매개 변수를 올바르게 전달하는 방법은 무엇입니까? 다음 코드는 404 찾을 수 없음 응답을 가져옵니다.

String url = "https://app.example.com/hr/email";

Map<String, String> params = new HashMap<String, String>();
params.put("email", "first.last@example.com");

RestTemplate restTemplate = new RestTemplate();
ResponseEntity<String> response = restTemplate.postForEntity( url, params, String.class );

Postman에서 올바른 호출을 공식화하려고 시도했으며 본문에서 전자 메일 매개 변수를 "양식 데이터"매개 변수로 지정하여 올바르게 작동하게 할 수 있습니다. RestTemplate에서이 기능을 구현하는 올바른 방법은 무엇입니까?

해결법

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

    1.POST 메소드는 HTTP 요청 오브젝트를 따라 보내야합니다. 요청에는 HTTP 헤더 또는 HTTP 본문 중 하나 또는 둘 모두가 포함될 수 있습니다.

    POST 메소드는 HTTP 요청 오브젝트를 따라 보내야합니다. 요청에는 HTTP 헤더 또는 HTTP 본문 중 하나 또는 둘 모두가 포함될 수 있습니다.

    그러므로 HTTP 엔티티를 만들고 body에 헤더와 매개 변수를 보냅니다.

    HttpHeaders headers = new HttpHeaders();
    headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
    
    MultiValueMap<String, String> map= new LinkedMultiValueMap<String, String>();
    map.add("email", "first.last@example.com");
    
    HttpEntity<MultiValueMap<String, String>> request = new HttpEntity<MultiValueMap<String, String>>(map, headers);
    
    ResponseEntity<String> response = restTemplate.postForEntity( url, request , String.class );
    

    http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/client/RestTemplate.html#postForObject-java.lang.String-java.lang.Object-java.lang.Class-java.lang.Object...-

  2. ==============================

    2.혼합 된 데이터를 POST하는 방법 : File, String [], String.

    혼합 된 데이터를 POST하는 방법 : File, String [], String.

    필요한 것만 사용할 수 있습니다.

    private String doPOST(File file, String[] array, String name) {
        RestTemplate restTemplate = new RestTemplate(true);
    
        //add file
        LinkedMultiValueMap<String, Object> params = new LinkedMultiValueMap<>();
        params.add("file", new FileSystemResource(file));
    
        //add array
        UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl("https://my_url");
        for (String item : array) {
            builder.queryParam("array", item);
        }
    
        //add some String
        builder.queryParam("name", name);
    
        //another staff
        String result = "";
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.MULTIPART_FORM_DATA);
    
        HttpEntity<LinkedMultiValueMap<String, Object>> requestEntity =
                new HttpEntity<>(params, headers);
    
        ResponseEntity<String> responseEntity = restTemplate.exchange(
                builder.build().encode().toUri(),
                HttpMethod.POST,
                requestEntity,
                String.class);
    
        HttpStatus statusCode = responseEntity.getStatusCode();
        if (statusCode == HttpStatus.ACCEPTED) {
            result = responseEntity.getBody();
        }
        return result;
    }
    

    POST 요청의 Body 및 다음 구조에 File이 있습니다.

    POST https://my_url?array=your_value1&array=your_value2&name=bob 
    
  3. ==============================

    3.다음은 Spring의 RestTemplate을 사용하여 POST 나머지 호출을 작성하는 전체 프로그램입니다.

    다음은 Spring의 RestTemplate을 사용하여 POST 나머지 호출을 작성하는 전체 프로그램입니다.

    import java.util.HashMap;
    import java.util.Map;
    
    import org.springframework.http.HttpEntity;
    import org.springframework.http.ResponseEntity;
    import org.springframework.util.LinkedMultiValueMap;
    import org.springframework.util.MultiValueMap;
    import org.springframework.web.client.RestTemplate;
    
    import com.ituple.common.dto.ServiceResponse;
    
       public class PostRequestMain {
    
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            MultiValueMap<String, String> headers = new LinkedMultiValueMap<String, String>();
            Map map = new HashMap<String, String>();
            map.put("Content-Type", "application/json");
    
            headers.setAll(map);
    
            Map req_payload = new HashMap();
            req_payload.put("name", "piyush");
    
            HttpEntity<?> request = new HttpEntity<>(req_payload, headers);
            String url = "http://localhost:8080/xxx/xxx/";
    
            ResponseEntity<?> response = new RestTemplate().postForEntity(url, request, String.class);
            ServiceResponse entityResponse = (ServiceResponse) response.getBody();
            System.out.println(entityResponse.getData());
        }
    
    }
    
  4. ==============================

    4.당신의 URL 문자열은 당신이 일하기 위해 전달하는지도에 대한 가변 마커를 필요로합니다 :

    당신의 URL 문자열은 당신이 일하기 위해 전달하는지도에 대한 가변 마커를 필요로합니다 :

    String url = "https://app.example.com/hr/email?{email}";
    

    또는 다음과 같이 쿼리 매개 변수를 String에 명시 적으로 코딩하여지도를 전달하지 않아도됩니다.

    String url = "https://app.example.com/hr/email?email=first.last@example.com";
    

    https://stackoverflow.com/a/47045624/1357094도 참조하십시오.

  5. from https://stackoverflow.com/questions/38372422/how-to-post-form-data-with-spring-resttemplate by cc-by-sa and MIT license