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?

68
demandé sur pramodc84 2016-07-14 13:59:20

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

http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/client/RestTemplate.html#postForObject-java.lang.String-java.lang.Object-java.lang.Class-java.lang.Object...-

177
répondu Tharsan Sivakumar 2016-07-15 05:01:01

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 
9
répondu Yuliia Ashomok 2018-09-29 01:25:38

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

}
6
répondu Piyush Mittal 2017-01-16 04:40:11

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

0
répondu cellepo 2017-10-31 22:52:09

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 :)

-1
répondu Md. Sajedul Karim 2018-08-13 05:47:27