JSON में RestTemplate के माध्यम से पोस्ट अनुरोध


126

मुझे अपनी समस्या को हल करने का कोई उदाहरण नहीं मिला, इसलिए मैं आपसे मदद मांगना चाहता हूं। मैं केवल JSON में RestTemplate ऑब्जेक्ट का उपयोग करके POST अनुरोध नहीं भेज सकता

हर बार मुझे मिलता है:

org.springframework.web.client.HttpClientErrorException: 415 असमर्थित मीडिया प्रकार

मैं इस तरह से RestTemplate का उपयोग करता हूं:

...
restTemplate = new RestTemplate();
List<HttpMessageConverter<?>> list = new ArrayList<HttpMessageConverter<?>>();
list.add(new MappingJacksonHttpMessageConverter());
restTemplate.setMessageConverters(list);
...
Payment payment= new Payment("Aa4bhs");
Payment res = restTemplate.postForObject("http://localhost:8080/aurest/rest/payment", payment, Payment.class);

मेरी गल्ती क्या है?


1
@troyfolger the url अब मान्य नहीं है
Noremac

धन्यवाद - यह लिंक इस लेखन के रूप में काम कर रहा है: spring.io/guides/gs/consuming-rest
troyfolger

विशिष्ट ओपी समस्या को संबोधित करने के लिए, ऊपर, आप शायद उचित सामग्री प्रकार के साथ एक HTTP हेडर को याद कर रहे हैं, नीचे morganw09dev से उत्तर देखें।
ट्रॉफ्लोगर

ये समस्याएँ ज्यादातर सर्वर API कॉन्फ़िगरेशन से संबंधित हैं। आप एक स्टैंडअलोन क्लाइंट (जैसे पोस्टमैन) का उपयोग करके सर्वर एपीआई का परीक्षण करते हैं और आपके अनुरोध में उसी हेडर को दोहराते हैं। कम से कम मेरे मामले में जो चालबाजी की।
लिनुस

1
@ जॉनी बी, अगर इसका उत्तर दिया गया है, तो कृपया जवाब को चिह्नित करें
विशाल

जवाबों:


161

इस तकनीक ने मेरे लिए काम किया:

HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);

HttpEntity<String> entity = new HttpEntity<String>(requestJson, headers);
ResponseEntity<String> response = restTemplate.put(url, entity);

आशा है कि ये आपकी मदद करेगा


3
कृपया बताएं कि किस पंक्ति को http अनुरोध का परिणाम लौटना चाहिए
gstackoverflow

मेरे लिए यह किसी भी हेडर को निर्दिष्ट करने के लिए आवश्यक नहीं था। मैंने HttpEntity का उपयोग किया है जो एकल पैरामीटर लेता है।
कॉन्स्टैंटिनो क्रोनमबर्गर

24
विधि .put()है void!
सदस्य

4
का प्रयोग postForEntity(url, entity, String.class)के स्थान पर काम करता हैput(url, entity)
Janac मीणा

1
@Kanu, requestJson वैध JSON स्ट्रिंग है या कुछ और?
देवा

95

मैं एक REST समापन बिंदु डीबग करने का प्रयास करते समय इस समस्या को पार कर गया। यहाँ एक मूल उदाहरण है स्प्रिंग पोस्ट के RestTemplate वर्ग का उपयोग एक POST अनुरोध करने के लिए जो मैंने किया था। वर्किंग वर्जन पाने के लिए अलग-अलग जगहों से एक साथ कोड पीसने में मुझे काफी लंबा समय लगा।

RestTemplate restTemplate = new RestTemplate();

String url = "endpoint url";
String requestJson = "{\"queriedQuestion\":\"Is there pain in your hand?\"}";
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);

HttpEntity<String> entity = new HttpEntity<String>(requestJson,headers);
String answer = restTemplate.postForObject(url, entity, String.class);
System.out.println(answer);

विशेष रूप से JSON पार्सर मेरा बाकी समापन बिंदु फ़ील्ड नामों के आसपास आवश्यक दोहरे उद्धरण चिह्नों का उपयोग कर रहा था, इसलिए मैंने अपने अनुरोध में डबल उद्धरणों से बच गया है।


क्या आप मुझे इस stackoverflow.com/questions/42240927/…
FaisalAhmed

क्या स्प्रिंग जावा ऑब्जेक्ट को स्वतः बदलने के लिए संदेश कन्वर्टर्स का उपयोग कर सकता है जैसे कि यह रेस्टफ्रेम के साथ रेस्टफुल एपीआई में किया था?
गिर जाते हैं

1
APPLICATION_JSON को मीडिया प्रकार सेट करना समस्या को हल करने की कुंजी है।
पीट टी

मैंने HttpEntity <String> unit = new HttpEntity <string> (requestJson, हेडर) का उपयोग करके अपनी समस्या का समाधान किया; यह पंक्ति
वेद प्रकाश

76

मैं JSONObjects के साथ बाकी टेम्पलेट का उपयोग कर रहा हूं:

// create request body
JSONObject request = new JSONObject();
request.put("username", name);
request.put("password", password);

// set headers
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
HttpEntity<String> entity = new HttpEntity<String>(request.toString(), headers);

// send request and parse result
ResponseEntity<String> loginResponse = restTemplate
  .exchange(urlString, HttpMethod.POST, entity, String.class);
if (loginResponse.getStatusCode() == HttpStatus.OK) {
  JSONObject userJson = new JSONObject(loginResponse.getBody());
} else if (loginResponse.getStatusCode() == HttpStatus.UNAUTHORIZED) {
  // nono... bad credentials
}

धन्यवाद - JSONObjectStString विधि मेरे लिए उपयोगी थी, इसने मुझे मेरे JSONString को सटीक बनाने में मदद की।
साइमन

1
इसके लिए उपरोक्त कोड कैसे विकसित किया गया है: कर्ल -vvv -X POST " लोकलहोस्ट: 8080 / सिल्लीसेवा_एसआरसी / oauth / ... "?
Pra_A

@ मैकाले लेपिस्टॉ मैं सर्वर अंत में json से इन मापदंडों को कैसे प्राप्त कर सकता हूं ??
KJEjava48

@ KJEjava48 मुझे समझ नहीं आ रहा है कि आपका क्या मतलब है ... यह प्रतिक्रिया में सर्वर साइड कोड है। यदि आप यह सोच रहे हैं कि कैसे json प्रतिक्रिया को पार्स करें, तो यह उस रूपरेखा पर निर्भर करता है जिसका आप उपयोग कर रहे हैं।
मिकेल लेपिस्टो

@ MikaelLepistö मेरा मतलब है कि java में दूसरे रिस्पॉन्स को पार्स करने के लिए कैसे java में रिस्पॉन्स प्राप्त किया जाए? आपने केवल एक एंड के लिए कोड (यानी, सर्वर साइड) पोस्ट किया है।
KJEjava48

13

यहाँ निर्दिष्ट के रूप में मुझे लगता है कि आपको एक के messageConverterलिए जोड़ने की आवश्यकता हैMappingJacksonHttpMessageConverter


9

यदि आप स्प्रिंग 3.0 का उपयोग कर रहे हैं, तो org.springframework.web.client.HttpClientErrorException: 415 असमर्थित मीडिया प्रकार अपवाद से बचने का एक आसान तरीका है, अपने क्लासपाथ में जैक्सन जार फ़ाइलों को शामिल करना, और mvc:annotation-drivenकॉन्फिग तत्व का उपयोग करना । जैसा कि यहाँ निर्दिष्ट है

मैं अपने बालों को बाहर निकालने की कोशिश कर रहा था कि क्यों mvc-ajax ऐप ने बिना किसी विशेष कॉन्फिगर के काम किया MappingJacksonHttpMessageConverter। यदि आप मेरे द्वारा जुड़े लेख को निकट से पढ़ते हैं:

कवर के नीचे, स्प्रिंग MVC सीरीज़ेशन करने के लिए एक HttpMessageConverter को दर्शाता है। इस स्थिति में, स्प्रिंग MVC जैक्सन JSON प्रोसेसर पर निर्मित एक MAPJacksonHttpMessageConverter को आमंत्रित करता है। जब आप mvc का उपयोग करते हैं तो यह कार्यान्वयन स्वचालित रूप से सक्षम होता है : जैक्सन के साथ एनोटेशन-चालित कॉन्फ़िगरेशन तत्व आपके क्लासपाथ में मौजूद है


7

"415 असमर्थित मीडिया प्रकार" त्रुटि आपको बता रही है कि सर्वर आपके पोस्ट अनुरोध को स्वीकार नहीं करेगा। आपका अनुरोध बिल्कुल ठीक है, यह सर्वर है जो गलत तरीके से कॉन्फ़िगर किया गया है।

MappingJacksonHttpMessageConverterस्वचालित रूप से अनुरोध सामग्री-प्रकार शीर्ष लेख को सेट करेगा application/json, और मेरा अनुमान है कि आपका सर्वर इसे अस्वीकार कर रहा है। आपने हमें अपने सर्वर सेटअप के बारे में कुछ नहीं बताया है, हालांकि, मैं वास्तव में उस पर आपको सलाह नहीं दे सकता।


7

मैं इस तरह से कर रहा हूं और यह काम करता है।

HttpHeaders headers = createHttpHeaders(map);
public HttpHeaders createHttpHeaders(Map<String, String> map)
{   
    HttpHeaders headers = new HttpHeaders();
    headers.setContentType(MediaType.APPLICATION_JSON);
    for (Entry<String, String> entry : map.entrySet()) {
        headers.add(entry.getKey(),entry.getValue());
    }
    return headers;
}

// यहां हेडर पास करें

 String requestJson = "{ // Construct your JSON here }";
logger.info("Request JSON ="+requestJson);
HttpEntity<String> entity = new HttpEntity<String>(requestJson, headers);
ResponseEntity<String> response = restTemplate.exchange(url, HttpMethod.POST, entity, String.class);
logger.info("Result - status ("+ response.getStatusCode() + ") has body: " + response.hasBody());
logger.info("Response ="+response.getBody());

उम्मीद है की यह मदद करेगा


4

मुझे यह समस्या हो रही थी और मैं क्लाइंट पर स्प्रिंग के रेस्टेमप्लेट और सर्वर पर स्प्रिंग वेब का उपयोग कर रहा हूं। दोनों एपीआई में बहुत खराब त्रुटि रिपोर्टिंग है, जिससे उन्हें विकसित करना बेहद मुश्किल है।

सभी तरह के प्रयोगों की कोशिश करने के कई घंटों के बाद मुझे पता चला कि अपेक्षित सूची के बजाय यह समस्या POST निकाय के लिए एक अशक्त संदर्भ में पारित होने के कारण हो रही है। मुझे लगता है कि RestTemplate एक अशक्त वस्तु से सामग्री-प्रकार का निर्धारण नहीं कर सकता है, लेकिन इसके बारे में शिकायत नहीं करता है। सही हेडर जोड़ने के बाद, मुझे अपनी सेवा पद्धति में प्रवेश करने से पहले स्प्रिंग में एक अलग सर्वर-साइड अपवाद मिलना शुरू हो गया।

फिक्स क्लाइंट की खाली सूची में अशक्त के बजाय पास करना था। चूंकि गैर-अशक्त वस्तुओं के लिए डिफ़ॉल्ट सामग्री-प्रकार का उपयोग किया जाता है, इसलिए किसी हेडर की आवश्यकता नहीं होती है।


3

यह कोड मेरे लिए काम कर रहा है;

RestTemplate restTemplate = new RestTemplate();
Payment payment = new Payment("Aa4bhs");
MultiValueMap<String, Object> map = new LinkedMultiValueMap<String, Object>();
map.add("payment", payment);
HttpEntity<MultiValueMap<String, Object>> httpEntity = new HttpEntity<MultiValueMap<String, Object>>(map, headerObject);

Payment res = restTemplate.postForObject(url, httpEntity, Payment.class);

मैं एक बहुत ही समान दृष्टिकोण का उपयोग कर रहा हूं और इसने मेरे लिए काम नहीं किया। किसी कारण से मेरे 'मैप' के बराबर को जोंस में परिवर्तित नहीं किया जा रहा है या आउटबाउंड बॉडी के रूप में शामिल किया गया है, लक्ष्य सेवा में कोई पेलोड नहीं दिखता है।
अब्दुल

2

यदि आप प्रतिक्रिया की प्रक्रिया नहीं करना चाहते हैं

private RestTemplate restTemplate = new RestTemplate();
restTemplate.postForObject(serviceURL, request, Void.class);

यदि आपको प्रक्रिया के लिए प्रतिक्रिया की आवश्यकता है

String result = restTemplate.postForObject(url, entity, String.class);

0

मेरे लिए इस सेटअप के साथ त्रुटि हुई:

AndroidAnnotations Spring Android RestTemplate Module तथा ...

GsonHttpMessageConverter

एंड्रॉइड एनोटेशन में POSTपैरामीटर के बिना अनुरोध उत्पन्न करने के लिए परिवर्तित की गई कुछ समस्याएं हैं । बस पैरामीटर new Object()मेरे लिए इसे हल किया।


0

आपको जितना मेहनत करना है उससे ज्यादा मेहनत क्यों करें? इनपुट के रूप में postForEntityएक साधारण Mapवस्तु को स्वीकार करता है । स्प्रिंग में दिए गए REST समापन बिंदु के लिए परीक्षण लिखते समय निम्नलिखित मेरे लिए ठीक काम करता है। मेरा मानना ​​है कि वसंत में JSON POST अनुरोध करने का यह सबसे सरल संभव तरीका है:

@Test
public void shouldLoginSuccessfully() {
  // 'restTemplate' below has been @Autowired prior to this
  Map map = new HashMap<String, String>();
  map.put("username", "bob123");
  map.put("password", "myP@ssw0rd");
  ResponseEntity<Void> resp = restTemplate.postForEntity(
      "http://localhost:8000/login",
      map,
      Void.class);
  assertThat(resp.getStatusCode()).isEqualTo(HttpStatus.OK);
}

0

यदि आप JSON को खुद से मैप नहीं करना चाहते हैं, तो आप इसे निम्नानुसार कर सकते हैं:

RestTemplate restTemplate = new RestTemplate();
restTemplate.setMessageConverters(Arrays.asList(new MappingJackson2HttpMessageConverter()));
ResponseEntity<String> result = restTemplate.postForEntity(uri, yourObject, String.class);

0

मैंने वसंत बूट में निम्नलिखित की कोशिश की:

ParameterizedTypeReference<Map<String, Object>> typeRef = new ParameterizedTypeReference<Map<String, Object>>() {};
public Map<String, Object> processResponse(String urlendpoint)
{
    try{
    
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_JSON);
        //reqobj
        JSONObject request = new JSONObject();
        request.put("username", name);
        //Or Hashmap 
        Map<String, Object> reqbody =  new HashMap<>();
        reqbody.put("username",username);
        Gson gson = new Gson();//mvn plugin to convert map to String
        HttpEntity<String> entity = new HttpEntity<>( gson.toJson(reqbody), headers);
        ResponseEntity<Map<String, Object>> response = resttemplate.exchange(urlendpoint, HttpMethod.POST, entity, typeRef);//example of post req with json as request payload
        if(Integer.parseInt(response.getStatusCode().toString()) == HttpURLConnection.HTTP_OK)
        {
            Map<String, Object>  responsedetails = response.getBody();
            System.out.println(responsedetails);//whole json response as map object
            return responsedetails;
        }
    } catch (Exception e) {
        // TODO: handle exception
        System.err.println(e);
    }
    return null;
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.