Comment poster des données de formulaire avec Spring RestTemplate?
je veux convertir l'extrait curl suivant en un appel RestTemplate:
curl -i -X POST -d "email=first.last@example.com" https://app.example.com/hr/email
Comment passer correctement le paramètre email? Le code suivant donne une réponse 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 );
j'ai essayé de formuler l'appel correct dans PostMan, et je peux le faire fonctionner correctement en spécifiant le paramètre email comme un paramètre" form-data " dans le corps. Quelle est la bonne manière d'obtenir cette fonctionnalité dans un RestTemplate?
5 réponses
la méthode POST doit être envoyée le long de L'objet de requête HTTP. Et la requête peut contenir soit L'en-tête HTTP, soit le corps HTTP, soit les deux.
créons donc une entité HTTP et envoyons les en-têtes et le paramètre dans le corps.
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 );
Comment afficher des données mélangées: fichier, Chaîne[], Chaîne en une seule requête.
vous ne pouvez utiliser que ce dont vous avez besoin.
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 requête POST aura le fichier dans son corps et la structure suivante:
POST https://my_url?array=your_value1&array=your_value2&name=bob
voici le programme complet pour faire un appel post rest en utilisant le 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());
}
}
votre chaîne d'url a besoin de marqueurs variables pour la carte que vous passez à travailler, comme:
String url = "https://app.example.com/hr/email?{email}";
ou vous pouvez explicitement coder les paramètres de la requête dans la chaîne pour commencer et ne pas avoir à passer la carte du tout, comme:
String url = "https://app.example.com/hr/email?email=first.last@example.com";
Voir aussi https://stackoverflow.com/a/47045624/1357094
la méthode POST doit contenir L'objet de requête HTTP,L'en-tête HTTP.
ensuite, vous devez créer une entité HTTP et envoyer les en-têtes et le paramètre dans le corps.
normalement, vous pouvez utiliser l'échange method
de RestTemplate
.
mécanisme interne d'échange est donnée ci-dessous :
public <T> ResponseEntity<T> exchange(String url, HttpMethod method,
HttpEntity<?> requestEntity, Class<T> responseType, Object... uriVariables) throws RestClientException
Il faut soufflet paramètres:
- String url, / / URL de point de terminaison rest
- HttpMethod method / / It may GET,POST,PUT,PATCH etc..
- HttpEntity requestEntity
- Classe responseType // C'est la réponse du service
- objet... uriVariables
Il a également jeter RestClientException
.
Exception RestClientException
a HttpClientErrorException
et HttpStatusCodeException
exception.
dans RestTemplete
il peut y avoir une exception HttpClientErrorException
et HttpStatusCodeException
.
Dans l'objet exception, vous pouvez obtenir le message d'erreur exact en utilisant cette façon: exception.getResponseBodyAsString()
Voici l'exemple de code :
public Object callToRestService(HttpMethod httpMethod, String url, Object requestObject, Class<?> responseObject) {
printLog( "Url : " + url);
printLog( "callToRestService Request : " + new GsonBuilder().setPrettyPrinting().create().toJson(requestObject));
try {
RestTemplate restTemplate = new RestTemplate();
restTemplate.getMessageConverters().add(new MappingJackson2HttpMessageConverter());
restTemplate.getMessageConverters().add(new StringHttpMessageConverter());
HttpHeaders requestHeaders = new HttpHeaders();
requestHeaders.setContentType(MediaType.APPLICATION_JSON);
HttpEntity<Object> entity = new HttpEntity<>(requestObject, requestHeaders);
long start = System.currentTimeMillis();
ResponseEntity<?> responseEntity = restTemplate.exchange(url, httpMethod, entity, responseObject);
printLog( "callToRestService Status : " + responseEntity.getStatusCodeValue());
printLog( "callToRestService Body : " + new GsonBuilder().setPrettyPrinting().create().toJson(responseEntity.getBody()));
long elapsedTime = System.currentTimeMillis() - start;
printLog( "callToRestService Execution time: " + elapsedTime + " Milliseconds)");
if (responseEntity.getStatusCodeValue() == 200 && responseEntity.getBody() != null) {
return responseEntity.getBody();
}
} catch (HttpClientErrorException exception) {
printLog( "callToRestService Error :" + exception.getResponseBodyAsString());
//Handle exception here
}catch (HttpStatusCodeException exception) {
printLog( "callToRestService Error :" + exception.getResponseBodyAsString());
//Handle exception here
}
return null;
}
Voici la description du code :
dans cette méthode, vous devez passer la demande et la classe de réponse. Cette méthode analyse automatiquement la réponse comme demandé objet.
tout d'abord vous devez ajouter convertisseur de message.
restTemplate.getMessageConverters().add(new MappingJackson2HttpMessageConverter());
restTemplate.getMessageConverters().add(new StringHttpMessageConverter());
il faut ajouter requestHeader
.
Voici le code:
HttpHeaders requestHeaders = new HttpHeaders();
requestHeaders.setContentType(MediaType.APPLICATION_JSON);
HttpEntity<Object> entity = new HttpEntity<>(requestObject, requestHeaders);
Enfin, vous devez appeler la méthode d'échange:
ResponseEntity<?> responseEntity = restTemplate.exchange(url, httpMethod, entity, responseObject);
pour l'impression j'ai utilisé la bibliothèque Gson.
voici le Grad: compile 'com.google.code.gson:gson:2.4'
vous pouvez simplement appeler le code ci-dessous pour obtenir la réponse:
ResponseObject response=new RestExample().callToRestService(HttpMethod.POST,"URL_HERE",new RequestObject(),ResponseObject.class);
voici le code de travail complet :
import com.google.gson.GsonBuilder;
import org.springframework.http.*;
import org.springframework.http.converter.StringHttpMessageConverter;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.web.client.HttpClientErrorException;
import org.springframework.web.client.HttpStatusCodeException;
import org.springframework.web.client.RestTemplate;
public class RestExample {
public RestExample() {
}
public Object callToRestService(HttpMethod httpMethod, String url, Object requestObject, Class<?> responseObject) {
printLog( "Url : " + url);
printLog( "callToRestService Request : " + new GsonBuilder().setPrettyPrinting().create().toJson(requestObject));
try {
RestTemplate restTemplate = new RestTemplate();
restTemplate.getMessageConverters().add(new MappingJackson2HttpMessageConverter());
restTemplate.getMessageConverters().add(new StringHttpMessageConverter());
HttpHeaders requestHeaders = new HttpHeaders();
requestHeaders.setContentType(MediaType.APPLICATION_JSON);
HttpEntity<Object> entity = new HttpEntity<>(requestObject, requestHeaders);
long start = System.currentTimeMillis();
ResponseEntity<?> responseEntity = restTemplate.exchange(url, httpMethod, entity, responseObject);
printLog( "callToRestService Status : " + responseEntity.getStatusCodeValue());
printLog( "callToRestService Body : " + new GsonBuilder().setPrettyPrinting().create().toJson(responseEntity.getBody()));
long elapsedTime = System.currentTimeMillis() - start;
printLog( "callToRestService Execution time: " + elapsedTime + " Milliseconds)");
if (responseEntity.getStatusCodeValue() == 200 && responseEntity.getBody() != null) {
return responseEntity.getBody();
}
} catch (HttpClientErrorException exception) {
printLog( "callToRestService Error :" + exception.getResponseBodyAsString());
//Handle exception here
}catch (HttpStatusCodeException exception) {
printLog( "callToRestService Error :" + exception.getResponseBodyAsString());
//Handle exception here
}
return null;
}
private void printLog(String message){
System.out.println(message);
}
}
désolé pour le mauvais anglais.
Merci. Espérons que cela vous aidera beaucoup :)