स्प्रिंग रिस्टेमप्लेट के साथ डेटा कैसे पोस्ट करें?


147

मैं निम्नलिखित (कार्यशील) कर्ल स्निपेट को रीस्टेमप्लेट कॉल में बदलना चाहता हूं:

curl -i -X POST -d "email=first.last@example.com" https://app.example.com/hr/email

मैं ईमेल पैरामीटर को सही तरीके से कैसे पास करूं? 404 में निम्नलिखित कोड परिणाम प्रतिक्रिया नहीं मिली:

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

मैंने पोस्टमैन में सही कॉल तैयार करने की कोशिश की है, और मैं इसे ईमेल पैरामीटर को शरीर में "फॉर्म-डेटा" पैरामीटर के रूप में निर्दिष्ट करके सही ढंग से काम कर सकता हूं। एक RestTemplate में इस कार्यक्षमता को प्राप्त करने का सही तरीका क्या है?


RestTemplate.exchange () की कोशिश करें;
हम

आपके द्वारा यहां दिए गए url की स्वीकार्य सामग्री प्रकार क्या है?
थरसन शिवकुमार

इस ब्लॉग को देखें, जो मैं वही काम करने की कोशिश कर रहा हूं जो मुझे लगता है कि Techie-mixture.blogspot.com/2016/07/…
थर्सन शिवकुमार

@TharsanSivakumar यूआरएल जेएलएन को लौटा देगा।
सिम

जवाबों:


355

POST विधि को HTTP अनुरोध ऑब्जेक्ट के साथ भेजा जाना चाहिए। और अनुरोध में HTTP शीर्ष लेख या HTTP निकाय या दोनों हो सकते हैं।

इसलिए चलो एक HTTP इकाई बनाएँ और हेडर और पैरामीटर को शरीर में भेजें।

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। कक्षा-java.lang.Object ...-


1
आप इस लिंक को और अधिक जानकारी के लिए बता सकते हैं techie-mixture.blogspot.com/2016/07/…
थर्सन शिवकुमार

1
आपने मेरा दिन बचाया, मुझे उम्मीद थी कि रेस्टेमप्लेट का उपयोग करना बहुत स्पष्ट है, लेकिन कुछ तरकीबें हैं!
सर्गी गेटमैन

1
ResponseEntity<String> response = new RestTemplate().postForEntity(url, request, String.class);मैं मिल रहा हूँorg.springframework.http.converter.HttpMessageNotWritableExc‌​eption: Could not write content: No serializer found for class java.util.Collections$3
शिवकुमार मल्लसप्पा

दूसरों के स्ट्रिंग्स होने पर बॉडी पैरामीटर कैसे पास करें, लेकिन उनमें से एक स्ट्रिंग का प्रकार है [], जैसा कि नीचे अनुरोध डेटा argsस्ट्रिंग का एक सरणी हैcurl -X POST --data '{"file": "/xyz.jar", "className": "my.class.name", "args": ["100"]}' -H "Content-Type: application/json" localhost:1234/batches
khawarizmi

2
तो यह केवल तार के लिए काम करता है ... क्या होगा अगर मैं पेलोड में जावा ऑब्जेक्ट भेजना चाहता हूं?
देवांश

23

मिश्रित डेटा कैसे पोस्ट करें: फ़ाइल, स्ट्रिंग [], एक अनुरोध में स्ट्रिंग।

आप केवल वही उपयोग कर सकते हैं, जिसकी आपको आवश्यकता है।

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

POST अनुरोध में इसकी बॉडी और अगली संरचना में फ़ाइल होगी:

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

मैंने यह तरीका आजमाया लेकिन मेरे लिए काम नहीं किया। मुझे मल्टीपार्ट प्रारूप में डेटा के साथ POST अनुरोध करने में समस्या आ रही है। यहाँ मेरा प्रश्न है कि क्या आप मुझे एक समाधान stackoverflow.com/questions/54429549/… के
दीप लाठिया

8

वसंत के रेस्टप्लेट का उपयोग करके POST रेस्ट कॉल करने का पूरा कार्यक्रम यहां दिया गया है।

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
फॉर्म डेटा के बजाय एप्लिकेशन /
जोंस

ResponseEntity<?> response = new RestTemplate().postForEntity(url, request, String.class);। मैं मिल रहा हूँorg.springframework.http.converter.HttpMessageNotWritableException: Could not write content: No serializer found for class java.util.Collections$3
शिवकुमार मल्लसप्पा

क्या आप कृपया अपना पूरा कार्यक्रम साझा कर सकते हैं या मुझे बता सकते हैं कि मैं कुछ नमूना नमूना कार्यक्रम @ ShhivkumarMallesappa
पीयूष मित्तल

यदि आप application/jsonसामग्री प्रकार को प्रतिस्थापित करते application/x-www-form-urlencodedहैं , तो आपको org.springframework.web.client.RestClientException मिल जाएगी : java.util.HashMap और सामग्री प्रकार "एप्लिकेशन / x-www-form-urlencoded" के लिए कोई HttpMessageConverter नहीं - stackoverflow.com/q-
Lu55

-3

आपके url स्ट्रिंग को आपके द्वारा काम करने के लिए पास किए जाने वाले मानचित्र के लिए वैरिएबल मार्कर की आवश्यकता है, जैसे:

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

या आप स्पष्ट रूप से शुरू करने के लिए स्ट्रिंग में क्वेरी पैरामेट्स को कोड कर सकते हैं और मानचित्र को पास नहीं करना होगा, जैसे:

String url = "https://app.example.com/hr/email?email=first.last@example.com";

यह भी देखें https://stackoverflow.com/a/47045624/1357094

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.