2016-07-14 13 views
45

Ich mag folgende (in Betrieb) curl Schnipsel zu einem RestTemplate Aufruf konvertieren:Wie POST Daten mit Spring RestTemplate formatieren?

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

Wie kann ich richtig die E-Mail-Parameter übergeben? Der folgende Code führt zu einem 404 Not Found Antwort:

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 richtigen Anruf in PostMan zu formulieren, und ich kann es richtig durch die Angabe der E-Mail-Parameter als „form-data“ Parameter erhalten arbeiten im Körper. Was ist der richtige Weg, um diese Funktionalität in einem RestTemplate zu erreichen?

+0

Versuchen Sie restTemplate.exchange(); –

+0

Was ist der akzeptable Inhaltstyp der URL, die Sie hier angegeben haben? –

+0

Schauen Sie sich dieses Blog an, das versucht, das gleiche zu tun, denke ich http://techie-mixture.blogspot.com/2016/07/spring-rest-template-sending-post.html –

Antwort

119

Die POST-Methode sollte entlang des HTTP-Anforderungsobjekts gesendet werden. Und die Anfrage kann entweder HTTP-Header oder HTTP-Body oder beides enthalten.

Lassen Sie uns also eine HTTP-Entität erstellen und die Header und Parameter im Text senden.

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

+0

Sie können diesen Link auch für weitere Informationen verweisen http: // techie-Mischung. blogspot.com/2016/07/spring-rest-template-sending-post.html –

+0

Du hast meinen Tag gerettet, ich habe erwartet, dass die Verwendung von _resttemplate_ ziemlich offensichtlich ist, aber es gibt ein paar Tricks! –

+0

ResponseEntity response = new RestTemplate(). PostForEntity (URL, request, String.class); 'Ich bekomme' org.springframework.http.converter.HttpMessageNotWritableException: Inhalt konnte nicht geschrieben werden: Kein Serializer für Klasse Java gefunden .util.Collections $ 3' –

5

hier ist das volle Programm einen POST-Rest Aufruf des RestTemplate mit Feder zu machen.

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

} 
+1

Die Anwendung/json wird anstelle der Formulardaten gesendet –

+0

'ResponseEntity response = new RestTemplate(). postForEntity (URL, request, String.class);'. Ich bekomme 'org.springframework.http.converter.HttpMessageNotWritableException: Konnte Inhalt nicht schreiben: Kein Serializer für Klasse gefunden java.util.Collections $ 3 ' –

+0

Könnten Sie bitte Ihr ganzes Programm teilen oder lassen Sie mich wissen, ich werde einige Beispielprogramm @ShivkumarMallesappa teilen –

4

POST gemischte Daten: Datei, String [], String in einer Anfrage.

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 wird Datei haben in es Körper und nächste Struktur ist:

POST https://my_url?array=your_value1&array=your_value2&name=bob 
0

Ihre url String benötigt Variable Marker für die Karte übergeben Sie arbeiten, wie:

String url = "https://app.example.com/hr/email?{email}"; 

Oder Sie könnten die Abfrageparameter explizit in die Zeichenfolge codieren, um damit zu beginnen und die Karte überhaupt nicht übergeben zu müssen, wie zum Beispiel:

String url = "https://app.example.com/hr/[email protected]"; 

Siehe auch https://stackoverflow.com/a/47045624/1357094

Verwandte Themen