Jersey 2.0 Content-Length nicht gesetzt
Ich versuche zu veröffentlichen, um einen web-service erfordert, dass der Content-Length-header gesetzt werden mit dem folgenden code:
//EDIT: added apache connector code
ClientConfig clientConfig = new ClientConfig();
ApacheConnector apache = new ApacheConnector(clientConfig);
//setup client to log requests and responses and their entities
client.register(new LoggingFilter(Logger.getLogger("com.example.app"), true));
Part part = new Part("123");
WebTarget target = client.target("https://api.thing.com/v1.0/thing/{thingId}");
Response jsonResponse = target.resolveTemplate("thingId", "abcdefg")
.request(MediaType.APPLICATION_JSON)
.header(HttpHeaders.AUTHORIZATION, "anauthcodehere")
.post(Entity.json(part));
Aus den release notes https://java.net/jira/browse/JERSEY-1617 und die Jersey-2.0-Dokumentation https://jersey.java.net/documentation/latest/message-body-workers.html es impliziert, dass "Content-Length" wird automatisch gesetzt. Allerdings bekomme ich einen 411-response-code zurück, aus dem server, der angibt, dass die Content-Length ist nicht in der Anfrage.
Kennt jemand den besten Weg, um die Content-Length-header gesetzt?
Habe ich überprüft durch die Einrichtung eines-logger, der Content-Length-header wird nicht erzeugt, die in der Anfrage.
Dank.
- Möchten Sie vielleicht, um zu überprüfen, ob die Anfrage inhaltlich hat sich die Content-Length oder nicht.
- Protokollierung aktivieren, um zu überprüfen, die Anforderung (
client.addFilter(new LoggingFilter(System.out))
) auf diese Weise können Sie sicher sein das Problem an Ihrem Ende. - Ich vernachlässigt, um zu erwähnen, dass ich nicht einrichten, einen logger und verifiziert, dass die Content-Length-header wird nicht erzeugt. Ich habe bearbeitet Sie meine Frage zur Wiedergabe der neuen Informationen.
- Es sieht aus wie die content-length wird nur eingestellt werden, wenn die Größe der Einheit nicht übersteigt und der konfiguriert buffer. Können Sie überprüfen Sie die Größe Ihrer Einheit gegen diese Konfiguration? Wenn die Einheit größer ist als der Puffer, dann können Sie sich entweder 1) erhöhen Sie den Puffer oder 2) berechnen Sie die content-Länge manuell
- Jersey 2 nicht
Content-Length
- header an den client im moment. Können Sie versuchen, dieContent-Length
manuell mit dem Wert-1
ob der server das umgehen kann? - Mein Inhalt ist nur 23 bytes, so dass nicht mehr als die Grenze für die Länge des Inhalts-Konfiguration. Mit Blick auf die aktuelle source-code, dieser ist Grenzwert auf 8 Kb. Danke für den Tipp aber.
- Macht den server gesendet
HTTP 411
auch wenn dieContent-Length
ist-1
? - unser server erfordert eine korrekte Content-Length und zurückgeben 411 wenn die Länge ist auf -1 gesetzt.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Lief ich einen kurzen test mit der Jersey-Client 2.2 und Netcat, und es zeigt mir, dass Jersey ist das senden des Content-Length-header, obwohl die LoggingFilter nicht melden.
Um diesen test zu tun, ich lief zuerst netcat in eine Schale.
Dann habe ich ausgeführt, das folgende Trikot-code in einer anderen shell.
Nachdem Sie diesen code ausführen, werden die folgenden Zeilen protokolliert.
Jedoch netcat berichten mehrere Kopfzeilen in der Nachricht.
Lief ich diesen test auf OSX mit Java6 und Java7, mit dem gleichen Ergebnis. Ich lief auch der test in Jersey 2.0, mit ähnlichen Ergebnissen.
Nach einem Blick auf den source-code für die ApacheConnector Klasse, ich sehe das problem. Wenn ein ClientRequest wird in ein HttpUriRequest eine private Methode
getHttpEntity()
genannt wird, gibt eine HttpEntity. Leider gibt eine HttpEntity derengetContentLength()
gibt immer ein -1.Wenn Sie die Apache http-client erzeugt Anfrage wird Sie die HttpEntity Objekt für die Länge und da gibt -1 zurück, keine
Content-Length
- header gesetzt wird.Ich mein problem gelöst durch die Schaffung einer neuen connector, der eine Kopie des Quellcodes für die ApacheConnector hat aber eine andere Implementierung der
getHttpEntity()
. Ich lese die Einheit aus der ursprünglichenClientRequest
in ein byte-array und dann wickeln Sie das byte-array mit einemByteArrayEntity
. Wenn Sie die Apache Http-client erzeugt Anfrage wird Sie das Unternehmen und dieByteArrayEntity
reagieren mit der richtigen content-Länge, die in Kurven ermöglicht dieContent-Length
header gesetzt werden.Hier ist der relevante code:
WARNUNG: Mein problem, der Raum war eng und enthalten nur kleine Einheit Körper als Teil der Anforderungen. Diese Methode oben vorgeschlagen, kann problematisch sein, mit großen Organisationen stellen wie die Bilder, so dass ich nicht denke, dass dies eine Allgemeine Lösung für alle.
Unterstützt wird dies im Trikot 2.5 (https://java.net/jira/browse/JERSEY-2224). Könnten Sie https://jersey.java.net/apidocs/latest/jersey/org/glassfish/jersey/client/RequestEntityProcessing.html#BUFFERED streamen Sie Ihre Inhalte. Ich habe ein einfaches Beispiel das beides zeigt, chunked-und buffering-Inhalte mit ApacheConnector. Kasse diesem Projekt: https://github.com/aruld/sof-18157218
Getestet hab ich mit Jersey 2.25.1 eine einfachere Lösung besteht in der Einstellung
setChunkedEncodingEnabled(false)
in der Jersey-Client-Konfiguration. Anstelle der Verwendung eines chunked-encoding, die gesamte Einheit ist für serialisierte im Speicher und die Content-Length ist auf Anfrage.Zur Referenz hier ist ein Beispiel für eine Konfiguration, die ich verwendet habe:
Ich verwendet habe,mitmproxy, um zu überprüfen, request-Header und der
Content-Length
header war richtig eingestellt.clientConfig.property(ClientProperties.REQUEST_ENTITY_PROCESSING, RequestEntityProcessing.BUFFERED);