මම මගේ සේවාදායක වැඩසටහනේ වසන්ත රාමුවේ රෙස්ට් ටෙම්ප්ලේට් භාවිතා කරන අතර, සේවාදායක පැත්තෙන්, මම ජේසන් බොඩි සමඟ GET ඉල්ලීමක් අර්ථ දැක්වුවෙමි. මගේ මූලික පරමාර්ථය ඔබේ අරමුණු වලට සමාන ය: ඉල්ලීමට පරාමිතීන් රාශියක් ඇති විට, ඒවා ශරීරයේ තැබීම දිගු URI නූලට දැමීමට වඩා පිළිවෙලට පෙනේ. ඔව්?
නමුත්, කනගාටුවට කරුණක් නම්, එය ක්රියාත්මක නොවීමයි! සේවාදායක පාර්ශවය පහත සඳහන් ව්යතිරේකය විසි කළේය:
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();
}
...
}
}
ExecuteInternal () ක්රමයේදී ආදාන තර්කය 'bufferedOutput' හි මගේ කේතය මඟින් සපයන ලද පණිවිඩ ශරීරය අඩංගු බව කරුණාවෙන් සලකන්න. මම එය නිදොස්කරණය හරහා දුටුවෙමි.
කෙසේ වෙතත්, සූදානම් වීමේ සම්බන්ධතාවය () හේතුවෙන්, ක්රියාත්මක කිරීමේ ඉන්ටර්නල් () හි getDoOutput () සෑම විටම අසත්යයක් ලබා දෙන අතර එමඟින් ස්වාරක්ෂක ප්රතිදානය සම්පූර්ණයෙන්ම නොසලකා හරිනු ඇත! එය ප්රතිදාන ප්රවාහයට පිටපත් නොවේ.
එහි ප්රති, ලයක් වශයෙන්, මගේ සේවාදායක වැඩසටහනට පණිවිඩ පණිවිඩයක් නොලැබුණු අතර එම ව්යතිරේකය විසි කළේය.
මෙය වසන්ත රාමුවේ RestTemplate පිළිබඳ උදාහරණයකි. කාරණය වන්නේ, පණිවුඩ ආයතනය තවදුරටත් HTTP පිරිවිතරයෙන් තහනම් කර නොතිබුණද, සමහර සේවාදායකයින් හෝ සේවාදායක පුස්තකාල හෝ රාමු තවමත් පැරණි පිරිවිතරයන්ට අනුකූල විය හැකි අතර GET ඉල්ලීමෙන් පණිවිඩ ශරීරය ප්රතික්ෂේප කළ හැකිය.