java - formulario - resttemplate spring example json
¿Cómo enviar datos de formulario con Spring RestTemplate? (4)
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 da como resultado 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 );
He intentado 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 un RestTemplate?
Aquí está el programa completo para hacer una llamada de descanso POST utilizando SpringTemplate.
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());
}
}
Cómo POSTAR datos mixtos: Archivo, Cadena [], Cadena en una solicitud.
Puede usar solo lo que necesita.
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á un archivo en su cuerpo y la siguiente estructura:
POST https://my_url?array=your_value1&array=your_value2&name=bob
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 el parámetro 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 );
Su url String necesita marcadores variables para el mapa que pasa al trabajo, como:
String url = "https://app.example.com/hr/email?{email}";
O podría codificar explícitamente los parámetros de consulta en la Cadena para comenzar y no tener que pasar el mapa en absoluto, como:
String url = "https://app.example.com/hr/[email protected]";
Ver también https://.com/a/47045624/1357094