Jersey/JAX-RS : Rückkehr Content-Length im response-header anstelle von chunked-transfer-encoding
Bin ich mit Jersey zum erstellen von RESTful-API-Ressourcen, und ResponseBuilder
zum generieren der Antwort.
Beispiel-code für die Rest-Ressource:
public class infoResource{
@GET
@Path("service/{id}")
@Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
public Response getCompany(@PathParam("id")String id) {
//company is just a POJO.
Company company = getCompany(id);
return Response.status(200).entity(company).build();
}
}
In der Antwort, es ist die Rückkehr chunked transfer encoding im response Header an. Was ist der richtige Weg, in die "Jersey world" haben Sie wieder die Content-Length
header anstelle der Transfer-Encoding: chunked
header die Antwort-Header?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Auswahl
Content-Length
oderTransfer-Encoding
ist nur die Behälter der Wahl. Es ist wirklich eine Sache der Puffergröße.Eine mögliche Lösung ist die Bereitstellung einer
SevletFilter
die Puffer alle diejenigen gemarshallt bytes und setztContent-Length
- header-Wert.Sehen auf dieser Seite.
ByteArrayOutputStream
, aber leicht zu fallen, und versuchen... fyi....In der Sie die Klasse, die Sie erweitert ResourceConfig können Sie die Größe des Puffers festzulegen. Antworten, die über dieser Größe sein wird, chunked, unten Content-Length.
Zum Beispiel, wenn Ihr inputstream gelesen wird aus einer lokalen Datei-system, nur
hinzufügen:
Check der vollständige code für eine deutlichere Erklärung:
Client-Seite wird ein Apache-HttpClient-code.
Antwort auf eine sehr ähnliche Frage auf StackOverflow kann finden Sie hier
Habe ich kopiert es hier, um sicherzustellen, dass es nicht in einem Kommentar:
Einer großen sample-filter, dies zu tun, kann standalone genutzt werden aus dem Projekt, ist diese ContentLengthFilter.java aus der Carrot2 Projekt auf github.
Beachten Sie, dass verwendet ein Antwort wrapper mit einem byte-stream um das Problem zu lösen, so dass dies auch sorgt dafür, dass
Transfer-Encoding: Chunked
nicht festgelegt durch einen anderen Filter/code in der filter-Kette, und überschreiben Sie IhreContent-Length
Kopf, wenn er gesetzt ist. Sie können überprüfen, dass durch das testen dieses mit größeren Dateien, wie Sie würden normalerweise werden wiederum unterteilt in die Antwort.Ich werde kopieren Sie den Inhalt der Datei hier als auch, um sicherzustellen, dass es nicht zu einer gebrochen-link: