J'utilise RestTemplate du framework Spring dans mon programme client et, côté serveur, j'ai défini une requête GET avec un corps Json. Mon objectif principal est le même que le vôtre: lorsque la demande a de nombreux paramètres, les mettre dans le corps semble plus ordonné que de les mettre dans la chaîne d'URI prolongée. Oui?
Mais, malheureusement, cela ne fonctionne pas! Le côté serveur a levé l'exception suivante:
org.springframework.http.converter.HttpMessageNotReadableException: le corps de demande requis est manquant ...
Mais je suis sûr que le corps du message est correctement fourni par mon code client, alors qu'est-ce qui ne va pas?
J'ai tracé la méthode RestTemplate.exchange () et trouvé ce qui suit:
// 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();
}
...
}
}
Veuillez noter que dans la méthode executeInternal (), l'argument d'entrée 'bufferedOutput' contient le corps du message fourni par mon code. Je l'ai vu à travers le débogueur.
Cependant, en raison de prepareConnection (), le getDoOutput () dans executeInternal () renvoie toujours false ce qui, à son tour, rend le bufferedOutput complètement ignoré! Il n'est pas copié dans le flux de sortie.
Par conséquent, mon programme serveur n'a reçu aucun corps de message et a levé cette exception.
Ceci est un exemple sur le RestTemplate du framework Spring. Le fait est que, même si le corps du message n'est plus interdit par la spécification HTTP, certaines bibliothèques ou infrastructures client ou serveur peuvent toujours se conformer à l'ancienne spécification et rejeter le corps du message de la demande GET.