Bagaimana cara POST membentuk data dengan Spring RestTemplate?

148

Saya ingin mengonversi cuplikan ikal (berfungsi) berikut menjadi panggilan RestTemplate:

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

Bagaimana cara saya melewati parameter email dengan benar? Kode berikut ini menghasilkan respons 404 Tidak Ditemukan:

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

Saya sudah mencoba merumuskan panggilan yang benar di PostMan, dan saya bisa membuatnya bekerja dengan benar dengan menetapkan parameter email sebagai parameter "form-data" di tubuh. Apa cara yang benar untuk mencapai fungsi ini di RestTemplate?

sim
sumber
Coba restTemplate.exchange ();
Kami adalah Borg
Apa jenis konten url yang dapat Anda berikan di sini?
Tharsan Sivakumar
Lihatlah blog ini yang mencoba melakukan hal yang sama, saya kira techie-mixture.blogspot.com/2016/07/…
Tharsan Sivakumar
@TharsanSivakumar Url akan mengembalikan JSON.
sim
Kemungkinan duplikat RestTemplate uriVariables tidak diperluas
cellepo

Jawaban:

356

Metode POST harus dikirim di sepanjang objek permintaan HTTP. Dan permintaan tersebut dapat berisi tajuk HTTP atau badan HTTP atau keduanya.

Karenanya mari kita buat entitas HTTP dan kirim header dan parameter di badan.

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

Tharsan Sivakumar
sumber
1
Anda dapat merujuk tautan ini juga untuk info lebih lanjut techie-mixture.blogspot.com/2016/07/...
Tharsan Sivakumar
1
Anda menyelamatkan hari saya, saya berharap menggunakan resttemplate cukup jelas, tetapi ada beberapa trik!
Sergii Getman
1
ResponseEntity<String> response = new RestTemplate().postForEntity(url, request, String.class);Saya mendapatkanorg.springframework.http.converter.HttpMessageNotWritableExc‌​eption: Could not write content: No serializer found for class java.util.Collections$3
Shivkumar Mallesappa
Cara meneruskan parameter tubuh ketika yang lain adalah Strings tetapi salah satunya adalah dari tipe String [], seperti dalam data permintaan di bawah argsini adalah sebuah array dari Stringcurl -X POST --data '{"file": "/xyz.jar", "className": "my.class.name", "args": ["100"]}' -H "Content-Type: application/json" localhost:1234/batches
khawarizmi
2
Jadi ini hanya berfungsi untuk string ... Bagaimana jika saya ingin mengirim objek java di payload?
devssh
23

Cara POST data campuran: File, String [], String dalam satu permintaan.

Anda hanya dapat menggunakan apa yang Anda butuhkan.

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

Permintaan POST akan memiliki File di Tubuh dan struktur berikutnya:

POST https://my_url?array=your_value1&array=your_value2&name=bob 
Yuliia Ashomok
sumber
Saya mencoba metode ini tetapi tidak berhasil untuk saya. Saya menghadapi masalah membuat permintaan POST dengan data dalam format multi bagian. Inilah pertanyaan saya jika Anda dapat membimbing saya dengan solusi stackoverflow.com/questions/54429549/...
Deep Lathia
8

di sini adalah program lengkap untuk membuat panggilan istirahat POST menggunakan pegas's RestTemplate.

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

}
Piyush Mittal
sumber
7
Itu memposting aplikasi / json alih-alih data formulir
Maciej Stępyra
ResponseEntity<?> response = new RestTemplate().postForEntity(url, request, String.class);. Saya mendapatkanorg.springframework.http.converter.HttpMessageNotWritableException: Could not write content: No serializer found for class java.util.Collections$3
Shivkumar Mallesappa
bisakah Anda membagikan seluruh program Anda atau beri tahu saya bahwa saya akan membagikan beberapa contoh program sampel @ShivkumarMallesappa
Piyush Mittal
Jika Anda mengganti application/jsonjenis konten dengan application/x-www-form-urlencodedAnda akan mendapatkan org.springframework.web.client.RestClientException: Tidak ada HttpMessageConverter untuk java.util.HashMap dan jenis konten "application / x-www-form-urlencoded" - lihat stackoverflow.com/q / 31342841/355438
Lu55
-3

String url Anda membutuhkan penanda variabel untuk peta yang Anda lewati agar berfungsi, seperti:

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

Atau Anda bisa secara eksplisit memberi kode pada params query ke dalam String untuk memulai dan tidak harus meneruskan peta sama sekali, seperti:

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

Lihat juga https://stackoverflow.com/a/47045624/1357094

selo
sumber