Ich verwende das RestTemplate des Spring-Frameworks in meinem Client-Programm und habe auf der Serverseite eine GET-Anforderung mit einem Json-Body definiert. Mein Hauptzweck ist der gleiche wie bei Ihnen: Wenn die Anforderung zahlreiche Parameter enthält, erscheint es ordentlicher, sie in den Body einzufügen, als sie in die verlängerte URI-Zeichenfolge einzufügen. Ja?
Aber leider funktioniert es nicht! Die Serverseite hat die folgende Ausnahme ausgelöst:
org.springframework.http.converter.HttpMessageNotReadableException: Erforderlicher Anforderungshauptteil fehlt ...
Aber ich bin mir ziemlich sicher, dass der Nachrichtentext von meinem Client-Code korrekt bereitgestellt wird. Was ist also falsch?
Ich habe die Methode RestTemplate.exchange () verfolgt und Folgendes gefunden:
// 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();
}
...
}
}
Bitte beachten Sie, dass in der Methode executeInternal () das Eingabeargument 'bufferedOutput' den von meinem Code bereitgestellten Nachrichtentext enthält. Ich habe es durch den Debugger gesehen.
Aufgrund von prepareConnection () gibt getDoOutput () in executeInternal () jedoch immer false zurück, wodurch der bufferedOutput vollständig ignoriert wird! Es wird nicht in den Ausgabestream kopiert.
Folglich hat mein Serverprogramm keinen Nachrichtentext empfangen und diese Ausnahme ausgelöst.
Dies ist ein Beispiel für das RestTemplate des Spring-Frameworks. Der Punkt ist, dass einige Client- oder Serverbibliotheken oder Frameworks möglicherweise der alten Spezifikation entsprechen und den Nachrichtentext aus der GET-Anforderung ablehnen, selbst wenn der Nachrichtentext nicht mehr durch die HTTP-Spezifikation verboten ist.