Saya menggunakan RestTemplate kerangka Spring di program klien saya dan, di sisi server, saya mendefinisikan permintaan GET dengan tubuh Json. Tujuan utama saya sama dengan Anda: ketika permintaan memiliki banyak parameter, menempatkannya di tubuh tampak lebih rapi daripada menempatkannya di string URI yang berkepanjangan. Iya?
Tapi, sayangnya, itu tidak berhasil! Sisi server melemparkan pengecualian berikut:
org.springframework.http.converter.HttpMessageNotReadableException: Badan permintaan yang diperlukan tidak ada ...
Tapi saya cukup yakin badan pesan disediakan dengan benar oleh kode klien saya, jadi apa yang salah?
Saya menelusuri metode RestTemplate.exchange () dan menemukan yang berikut:
// 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();
}
...
}
}
Harap perhatikan bahwa dalam metode executeInternal (), argumen input 'bufferedOutput' berisi isi pesan yang disediakan oleh kode saya. Saya melihatnya melalui debugger.
Namun, karena prepoconnection (), getDoOutput () dalam executeInternal () selalu mengembalikan false yang, pada gilirannya, membuat bufferedOutput benar-benar diabaikan! Itu tidak disalin ke aliran output.
Akibatnya, program server saya tidak menerima isi pesan dan melemparkan pengecualian itu.
Ini adalah contoh tentang kerangka RestTemplate dari Spring. Intinya adalah bahwa, bahkan jika badan pesan tidak lagi dilarang oleh spesifikasi HTTP, beberapa pustaka atau kerangka kerja klien atau server mungkin masih mematuhi spesifikasi lama dan menolak isi pesan dari permintaan GET.