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=first.last@example.com" 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", "first.last@example.com");

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?


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

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", "first.last@example.com");

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


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 

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

}

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?email=first.last@example.com";

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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.