web-dev-qa-db-fra.com

Comment POST former des données avec Spring RestTemplate?

Je souhaite convertir le fragment de code suivant (de travail) en un appel RestTemplate:

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

Comment passer le paramètre email correctement? Le code suivant génère une réponse 404 Introuvable:

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

J'ai essayé de formuler le bon appel dans PostMan, et je peux le faire fonctionner correctement en spécifiant le paramètre email en tant que paramètre "form-data" dans le corps. Quelle est la bonne façon d'obtenir cette fonctionnalité dans un RestTemplate?

99
sim

La méthode POST doit être envoyée avec l'objet de requête HTTP. Et la demande peut contenir un en-tête HTTP, un corps HTTP ou les deux.

Nous allons donc créer une entité HTTP et envoyer les en-têtes et les paramètres dans le corps.

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.Class-Java.lang.Object ...-

254
Tharsan Sivakumar

Comment POST données mélangées: Fichier, Chaîne [], Chaîne en une 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 demande POST aura File dans son corps et la structure suivante:

POST https://my_url?array=your_value1&array=your_value2&name=bob 
16
Yuliia Ashomok

voici le programme complet pour effectuer un appel POST rest en utilisant 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());
    }

}
7
Piyush Mittal