it-swarm.com.de

Wie kann ich mit Spring RestTemplate Daten POST bilden?

Ich möchte das folgende (funktionierende) Curl-Snippet in einen RestTemplate-Aufruf konvertieren:

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

Wie übergebe ich den E-Mail-Parameter richtig? Der folgende Code führt zu einer Antwort 404 Not Found:

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

Ich habe versucht, den korrekten Aufruf in PostMan zu formulieren, und ich kann ihn zum korrekten Funktionieren bringen, indem ich den E-Mail-Parameter als "Formulardaten" -Parameter im Textkörper spezifiziere. Was ist der richtige Weg, um diese Funktionalität in einer RestTemplate zu erreichen?

112
sim

Die POST -Methode sollte zusammen mit dem HTTP-Anforderungsobjekt gesendet werden. Die Anforderung kann entweder einen HTTP-Header oder einen HTTP-Body oder beides enthalten.

Erstellen wir daher eine HTTP-Entität und senden die Header und Parameter in body.

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 ...-

272

Gewusst wie: POST gemischte Daten: Datei, Zeichenfolge [], Zeichenfolge in einer Anforderung.

Sie können nur das verwenden, was Sie brauchen.

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

Die POST -Anforderung enthält die Datei im Hauptteil und in der nächsten Struktur:

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

hier ist das vollständige Programm, um einen POST Rest-Aufruf mit Spring's RestTemplate durchzuführen.

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