मैं अपने क्लाइंट प्रोग्राम में स्प्रिंग फ्रेमवर्क के रेस्टेमप्लेट का उपयोग कर रहा हूं और सर्वर-साइड पर, मैंने एक Json बॉडी के साथ GET अनुरोध को परिभाषित किया है। मेरा प्राथमिक उद्देश्य आपके जैसा ही है: जब अनुरोध में कई पैरामीटर होते हैं, तो उन्हें लंबे समय तक यूआरआई स्ट्रिंग में डालने की तुलना में शरीर में डालने से तनाव महसूस होता है। हाँ?
लेकिन, दुख की बात है कि यह काम नहीं कर रहा है! सर्वर-साइड ने निम्न अपवाद को फेंक दिया:
org.springframework.http.converter.HttpMessageNotReadableException: आवश्यक अनुरोध बॉडी गायब है ...
लेकिन मुझे पूरा यकीन है कि मेरे ग्राहक कोड द्वारा संदेश बॉडी को सही तरीके से प्रदान किया गया है, इसलिए क्या गलत है?
मैंने RestTemplate.exchange () विधि में पता लगाया और निम्नलिखित पाया:
// SimpleClientHttpRequestFactory.class
public class SimpleClientHttpRequestFactory implements ClientHttpRequestFactory, AsyncClientHttpRequestFactory {
...
protected void prepareConnection(HttpURLConnection connection, String httpMethod) throws IOException {
...
if (!"POST".equals(httpMethod) && !"PUT".equals(httpMethod) && !"PATCH".equals(httpMethod) && !"DELETE".equals(httpMethod)) {
connection.setDoOutput(false);
} else {
connection.setDoOutput(true);
}
...
}
}
// SimpleBufferingClientHttpRequest.class
final class SimpleBufferingClientHttpRequest extends AbstractBufferingClientHttpRequest {
...
protected ClientHttpResponse executeInternal(HttpHeaders headers, byte[] bufferedOutput) throws IOException {
...
if (this.connection.getDoOutput() && this.outputStreaming) {
this.connection.setFixedLengthStreamingMode(bufferedOutput.length);
}
this.connection.connect();
if (this.connection.getDoOutput()) {
FileCopyUtils.copy(bufferedOutput, this.connection.getOutputStream());
} else {
this.connection.getResponseCode();
}
...
}
}
कृपया ध्यान दें कि निष्पादनयोग्य () विधि में, इनपुट तर्क 'बफ़रड ऑउटपुट' में मेरे कोड द्वारा प्रदान संदेश निकाय है। मैंने इसे डिबगर के माध्यम से देखा।
हालाँकि, तैयार होने के कारण (), getDoOutput () निष्पादित में (हमेशा) झूठा लौटता है, जो बदले में, बफ़रऑउटपुट को पूरी तरह से अनदेखा कर देता है! इसे आउटपुट स्ट्रीम में कॉपी नहीं किया गया है।
नतीजतन, मेरे सर्वर प्रोग्राम को कोई संदेश नहीं मिला और उस अपवाद को फेंक दिया।
यह स्प्रिंग फ्रेमवर्क के रेस्टेमप्लेट के बारे में एक उदाहरण है। मुद्दा यह है कि, भले ही संदेश बॉडी HTTP युक्ति द्वारा निषिद्ध नहीं है, फिर भी कुछ क्लाइंट या सर्वर लाइब्रेरी या फ्रेमवर्क अभी भी पुराने चश्मे का अनुपालन कर सकते हैं और GET अनुरोध से संदेश निकाय को अस्वीकार कर सकते हैं।