2016-07-14 65 views
45

voglio convertire il seguente (di lavoro) ricciolo frammento a una chiamata RestTemplate:Come stampare i dati dei moduli POST con Spring RestTemplate?

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

Come faccio a passare correttamente il parametro e-mail? I codice seguente genera una risposta 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); 

ho cercato di formulare la chiamata corretta postino, e posso farlo funzionare correttamente specificando il parametro di posta elettronica come un parametro "form-data" nel corpo. Qual è il modo corretto per ottenere questa funzionalità in un RestTemplate?

+0

Prova restTemplate.exchange(); –

+0

Qual è il tipo di contenuto accettabile dell'URL che hai fornito qui? –

+0

Guarda questo blog che sta cercando di fare la stessa cosa suppongo che http://techie-mixture.blogspot.com/2016/07/spring-rest-template-sending-post.html –

risposta

119

Il metodo POST deve essere inviato insieme all'oggetto di richiesta HTTP. E la richiesta può contenere o l'intestazione HTTP o il corpo HTTP o entrambi.

Quindi creiamo un'entità HTTP e inviamo intestazioni e parametri nel corpo.

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

Puoi anche fare riferimento a questo link per ulteriori informazioni http: // techie-mixture. blogspot.com/2016/07/spring-rest-template-sending-post.html –

+0

Hai salvato la mia giornata, mi aspettavo che usare _resttemplate_ fosse abbastanza ovvio, ma ci sono alcuni trucchi! –

+0

'ResponseEntity response = new RestTemplate(). PostForEntity (url, request, String.class);' Sto ottenendo 'org.springframework.http.converter.HttpMessageNotWritableExc eption: Impossibile scrivere contenuto: nessun serializzatore trovato per la classe java .util.Collections $ 3' –

5

Ecco il programma completo per effettuare una chiamata POST resto usando RestTemplate di primavera.

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

Che post application/json invece dei dati del modulo –

+0

'ResponseEntity response = new RestTemplate(). postForEntity (url, request, String.class);'. Sto ottenendo 'org.springframework.http.converter.HttpMessageNotWritableException: Impossibile scrivere contenuto: nessun serializzatore trovato per la classe java.util.Collections $ 3' –

+0

potresti per favore condividere l'intero programma o fammi sapere condividerò qualche esempio di programma di esempio @ShivkumarMallesappa –

4

Come dati POST misti: File, String [], String in una richiesta.

È possibile utilizzare solo ciò che è necessario.

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 richiesta POST avrà file nel suo corpo e la prossima struttura:

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

la stringa URL bisogno marcatori variabili per la mappa si passa al lavoro, come:

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

Oppure puoi codificare esplicitamente i parametri della query nella stringa per iniziare e non dover affatto passare la mappa, ad esempio:

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

Vedi anche https://stackoverflow.com/a/47045624/1357094

Problemi correlati