¿Cómo PUBLICAR datos de formulario con Spring RestTemplate?

Resuelto sim asked hace 8 años • 4 respuestas

Quiero convertir el siguiente fragmento de curl (de trabajo) en una llamada RestTemplate:

curl -i -X POST -d "[email protected]" https://app.example.com/hr/email

¿Cómo paso el parámetro de correo electrónico correctamente? El siguiente código genera una respuesta 404 No encontrado:

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

Map<String, String> params = new HashMap<String, String>();
params.put("email", "[email protected]");

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

Intenté formular la llamada correcta en PostMan y puedo hacer que funcione correctamente especificando el parámetro de correo electrónico como un parámetro de "datos de formulario" en el cuerpo. ¿Cuál es la forma correcta de lograr esta funcionalidad en RestTemplate?

sim avatar Jul 14 '16 17:07 sim
Aceptado

El método POST debe enviarse junto con el objeto de solicitud HTTP. Y la solicitud puede contener un encabezado HTTP o un cuerpo HTTP o ambos.

Por lo tanto, creemos una entidad HTTP y enviemos los encabezados y los parámetros en el cuerpo.

HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);

MultiValueMap<String, String> map= new LinkedMultiValueMap<String, String>();
map.add("email", "[email protected]");

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. Clase-java.lang.Objeto...-

Tharsan Sivakumar avatar Jul 15 '2016 05:07 Tharsan Sivakumar

Cómo PUBLICAR datos mixtos: Archivo, Cadena [], Cadena en una solicitud.

Puedes usar solo lo que necesitas.

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

La solicitud POST tendrá Archivo en su Cuerpo y la siguiente estructura:

POST https://my_url?array=your_value1&array=your_value2&name=bob 
Yuliia Ashomok avatar May 28 '2017 12:05 Yuliia Ashomok

Aquí está el programa completo para realizar una llamada de descanso POST utilizando RestTemplate de Spring.

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

}
Piyush Mittal avatar Jan 16 '2017 04:01 Piyush Mittal