Spring RestTemplate으로 양식 데이터를 POST하는 방법은 무엇입니까?


147

다음 (작동) curl 스 니펫을 RestTemplate 호출로 변환하고 싶습니다.

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

이메일 매개 변수를 올바르게 전달하려면 어떻게합니까? 다음 코드는 404 Not Found 응답을 생성합니다.

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에서 올바른 호출을 공식화하려고 시도했으며 이메일 매개 변수를 본문에서 "form-data"매개 변수로 지정하여 올바르게 작동하도록 할 수 있습니다. RestTemplate에서이 기능을 수행하는 올바른 방법은 무엇입니까?


restTemplate.exchange ()를 시도하십시오.
우리는 Borg

여기에 제공 한 URL의 허용 가능한 콘텐츠 유형은 무엇입니까?
Tharsan Sivakumar


@TharsanSivakumar URL은 JSON을 반환합니다.
sim

답변:


355

POST 메소드는 HTTP 요청 오브젝트와 함께 전송되어야합니다. 요청에는 HTTP 헤더 또는 HTTP 본문 또는 둘 다가 포함될 수 있습니다.

따라서 HTTP 엔터티를 만들고 본문에 헤더와 매개 변수를 보냅니다.

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. 클래스 -java.lang.Object ...-



1
당신은 내 하루를 구했다, 나는 resttemplate 를 사용 하는 것이 꽤 분명 하다고 기대 했지만 몇 가지 트릭이있다!
Sergii Getman

1
ResponseEntity<String> response = new RestTemplate().postForEntity(url, request, String.class);나는 받고있다org.springframework.http.converter.HttpMessageNotWritableExc‌​eption: Could not write content: No serializer found for class java.util.Collections$3
Shivkumar Mallesappa

어떻게 다른 문자열 때 신체 파라미터를 전달하지만, 그 중 하나는 문자열 유형 []이다하는 요청 데이터 아래와 같이하여 args문자열의 배열curl -X POST --data '{"file": "/xyz.jar", "className": "my.class.name", "args": ["100"]}' -H "Content-Type: application/json" localhost:1234/batches
khawarizmi

2
그래서 이것은 문자열에서만 작동합니다 ... 페이로드로 Java 객체를 보내려면 어떻게해야합니까?
devssh

23

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

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

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와 다음 구조가 있습니다.

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

나는이 방법을 시도했지만 나에게 효과가 없었다. 멀티 파트 형식의 데이터로 POST 요청을하는 데 문제가 있습니다. 다음은 솔루션으로 나를 인도 할 수 있다면 내 질문 stackoverflow.com/questions/54429549/...
깊은 Lathia

8

다음은 스프링의 RestTemplate을 사용하여 POST rest 호출을 수행하는 전체 프로그램입니다.

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

}

7
양식 데이터 대신 애플리케이션 / json을 게시합니다
Maciej Stępyra

ResponseEntity<?> response = new RestTemplate().postForEntity(url, request, String.class);. 나는 무엇입니까org.springframework.http.converter.HttpMessageNotWritableException: Could not write content: No serializer found for class java.util.Collections$3
Shivkumar Mallesappa을

당신이 당신의 전체 프로그램을 공유하거나하시기 바랍니다 수있는 것은 제가 몇 가지 예제 샘플 프로그램 @ShivkumarMallesappa 공유 할 알려
Piyush 미탈

당신이 교체하는 경우 application/json에 의해 콘텐츠 형식을 application/x-www-form-urlencoded당신은 얻을 것이다 org.springframework.web.client.RestClientException을 : 없음 HttpMessageConverter를 java.util.HashMap에와 콘텐츠 유형에 대한 "/ x-www-form-urlencoded를 응용 프로그램" - 참조 stackoverflow.com/q / 31342841 / 355438
Lu55

-3

URL 문자열에는 다음과 같이 작업하기 위해 전달하는 맵에 변수 마커가 필요합니다.

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

또는 다음과 같이 쿼리 매개 변수를 명시 적으로 문자열로 코딩하여 맵을 전달할 필요가 없습니다.

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

참조 https://stackoverflow.com/a/47045624/1357094

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.