Ich verwende Jersey, um RESTful-API-Ressourcen zu erstellen, und ResponseBuilder
, um die Antwort zu generieren.
Beispielcode für die RESTful-Ressource:
%Vor% In der Antwort wird die chunked Transfer-Codierung in den Antwortheadern zurückgegeben. Wie lautet der richtige Weg in der "Jersey-Welt", dass der Header Content-Length
anstelle des Headers Transfer-Encoding: chunked
in den Antwortheadern zurückgegeben wird?
Die Auswahl von Content-Length
oder Transfer-Encoding
ist nur die Wahl dieses Containers. Es ist wirklich eine Frage der Puffergröße.
Eine mögliche Lösung ist die Bereitstellung eines SevletFilter
, das all diese marshallerten Bytes puffert und den Content-Length
header value festlegt.
Siehe diese Seite .
%Vor%Wenn Ihr Eingabestream beispielsweise nur von einem lokalen Dateisystem gelesen wird füge hinzu:
%Vor%Überprüfen Sie den vollständigen Code für eine klarere Erklärung:
%Vor%Die Clientseite ist ein Apache HttpClient-Code.
Eine Antwort auf eine sehr ähnliche Frage zu StackOverflow finden Sie hier
Ich habe es hier kopiert, um sicherzustellen, dass es nicht in einen Kommentar umgewandelt wird:
Ein großartiger Beispielfilter dafür, der unabhängig vom Projekt verwendet werden kann, ist dieses ContentLengthFilter.java aus dem Projekt Carrot2 auf github.
Beachten Sie, dass zur Lösung des Problems ein Antwort-Wrapper mit einem Byte-Stream verwendet wird. Dadurch wird auch sichergestellt, dass Transfer-Encoding: Chunked
nicht von einem anderen Filter / Code in der Filterkette gesetzt wird und Ihre Content-Length
-Header überschreibt es steht fest. Sie können dies überprüfen, indem Sie dies mit größeren Dateien testen, da diese normalerweise in der Antwort chunked werden.
Ich werde auch den Inhalt der Datei hier kopieren, um sicherzustellen, dass es nicht zu einem fehlerhaften Link wird:
%Vor%