¿Cómo PUBLICAR datos de formulario con Spring RestTemplate?
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?
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...-
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
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());
}
}