Sto usando RestTemplate del framework Spring nel mio programma client e, sul lato server, ho definito una richiesta GET con un corpo Json. Il mio scopo principale è lo stesso del tuo: quando la richiesta ha numerosi parametri, inserirli nel corpo sembra più ordinato che inserirli nella stringa URI prolungata. Sì?
Ma, purtroppo, non funziona! Il lato server ha generato la seguente eccezione:
org.springframework.http.converter.HttpMessageNotReadableException: corpo della richiesta richiesto mancante ...
Ma sono abbastanza sicuro che il corpo del messaggio sia correttamente fornito dal mio codice client, quindi cosa c'è che non va?
Ho rintracciato nel metodo RestTemplate.exchange () e ho trovato quanto segue:
// 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();
}
...
}
}
Si noti che nel metodo executeInternal (), l'argomento di input 'bufferedOutput' contiene il corpo del messaggio fornito dal mio codice. L'ho visto attraverso il debugger.
Tuttavia, a causa del preparConnection (), getDoOutput () in executeInternal () restituisce sempre false che, a sua volta, rende bufferedOutput completamente ignorato! Non viene copiato nel flusso di output.
Di conseguenza, il mio programma server non ha ricevuto il corpo del messaggio e ha generato tale eccezione.
Questo è un esempio del RestTemplate del framework Spring. Il punto è che, anche se il corpo del messaggio non è più proibito dalle specifiche HTTP, alcune librerie o framework client o server potrebbero comunque essere conformi alle specifiche precedenti e rifiutare il corpo del messaggio dalla richiesta GET.