আমি আমার ক্লায়েন্ট প্রোগ্রামে স্প্রিং ফ্রেমওয়ার্কের রেস্টটেম্পলেট ব্যবহার করছি এবং সার্ভার-সাইডে, আমি একটি জেসন বডি সহ একটি জিইটি অনুরোধকে সংজ্ঞায়িত করেছি। আমার প্রাথমিক উদ্দেশ্যটি আপনার মতোই: যখন অনুরোধটিতে অনেকগুলি পরামিতি থাকে, তাদের দীর্ঘস্থায়ী ইউআরআই স্ট্রিংয়ে রাখার চেয়ে শরীরে এগুলি দেওয়াকে পরিপাটি মনে হয়। হ্যাঁ?
কিন্তু, দুঃখের বিষয়, এটি কাজ করছে না! সার্ভার-সাইড নিম্নলিখিত ব্যতিক্রম ছুঁড়ে ফেলেছে:
org.springframework.http.converter.HttpMessageNotReadableException: প্রয়োজনীয় অনুরোধের শরীরটি অনুপস্থিত ...
তবে আমি পুরোপুরি নিশ্চিত যে আমার ক্লায়েন্ট কোড দ্বারা বার্তাটির দেহটি সঠিকভাবে সরবরাহ করা হয়েছে, তবে কী সমস্যা?
আমি রেস্টটেম্পলেট.এক্সচেঞ্জ () পদ্ধতিতে সনাক্ত করে নিম্নলিখিতটি পেয়েছি:
// 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 () সর্বদা মিথ্যা দেয় যা ফলস্বরূপ, বাফারড আউটপুটটিকে সম্পূর্ণ উপেক্ষা করে! এটি আউটপুট স্ট্রিমে অনুলিপি করা হয়নি।
ফলস্বরূপ, আমার সার্ভার প্রোগ্রামটি কোনও বার্তা না পেয়ে এই ব্যতিক্রমটি ছুঁড়ে ফেলেছে।
এটি স্প্রিং ফ্রেমওয়ার্কের রেস্টটেম্পলেট সম্পর্কে একটি উদাহরণ। মুল বক্তব্যটি হ'ল, এইচটিটিপি স্পেস দ্বারা বার্তাটির বডিটি আর নিষিদ্ধ না করা সত্ত্বেও কিছু ক্লায়েন্ট বা সার্ভার লাইব্রেরি বা ফ্রেমওয়ার্কগুলি পুরানো অনুমানটি মেনে চলতে পারে এবং জিইটি অনুরোধ থেকে বার্তাটির মূল অংশটি প্রত্যাখ্যান করে।