2010-09-15 7 views
5

Ich dekodiere HTTP-Pakete. Und ich sah ein Problem, dass Chunk-Problem. Wenn ich ein HTTP-Paket bekomme, hat es einen Header und einen Body. Wenn Transefer-Codierung ist chunked ich weiß nicht, was zu tun ist?Chunked HTTP-Decodierung in Java?

Gibt es eine nützliche API oder Klasse zum Dechunk der Daten in JAVA?

Und wenn jemand, erfahren über HTTP-Decodierung, bitte zeigen Sie mir einen Weg, wie man das macht?

Antwort

11

Verwenden Sie einen vollwertigen HTTP-Client wie Apache HttpComponents Client oder nur die Java SE java.net.URLConnection (mini tutorial here). Beides handhabt es völlig transparent und gibt Ihnen eine "normale" InputStream zurück. HttpClient wiederum kommt mit einer ChunkedInputStream, die Sie einfach mit verzieren müssen.

Wenn Sie wirklich darauf bestehen, eine Bibliothek dafür zu erstellen, dann würde ich vorschlagen, eine Klasse wie ChunkedInputStream extends InputStream zu erstellen und Logik entsprechend zu schreiben. Sie finden weitere Details, wie Sie es in this Wikipedia article analysieren können.

+0

Eigentlich mache ich Offline-HTTP-Decodierung und ich habe nur Header und Körper von http-Paket. Und ich werde das Paket entschlüsseln. Aber ich brauche eine API, die Header und Körper bekommt und entschlüsselte Daten liefert. Gibt es so api? – CodingForever

+0

Der Wikipedia-Artikel enthält Details wie ein Chunk aussieht. Sie können im Grunde nur auf CRLF teilen (\ r \ n). Es sind die Bytes 10 und 13. Der erste Teil ist dann der Header, der die Chunklänge in Hex darstellt. Der zweite Teil ist dann die Chunk-Daten selbst. Sie sammeln und verketten alle diese Brocken. Der 'ChunkedInputStream' macht genau das. – BalusC

+0

weil deine Antwort richtig ist. – CodingForever

1

Apache HttpComponents

Ach ja, und wenn wir über die Client-Seite sprechen, HttpUrlConnection tut dies auch.

+0

Ich werde offline http-Decodierung (bereits gefangene Pakete) und ich habe nur einen Header und einen Körper. Also brauche ich eine API, die nur Header und Körper bekommt und entschlüsselte Daten gibt. Gibt es eine API wie diese? – CodingForever

1

Wenn Sie nach einer einfachen API suchen, versuchen Sie Jodd Http Bibliothek (http://jodd.org/doc/http.html). Es behandelt Chunked Transfer-Codierung für Sie und Sie erhalten den ganzen Körper als String zurück.

Aus der Dokumentation:

HttpRequest httpRequest = HttpRequest.get("http://jodd.org"); 
HttpResponse response = httpRequest.send(); 

System.out.println(response); 
1

Hier ist quick-and-dirty Alternative, die keine Abhängigkeit außer Oracle JRE erfordert:

private static byte[] unchunk(byte[] content) throws IOException { 
    ByteArrayInputStream bais = new ByteArrayInputStream(content); 
    ChunkedInputStream cis = new ChunkedInputStream(bais, new HttpClient() {}, null); 
    return readFully(cis); 
} 

Es verwendet die gleiche sun.net.www.http.ChunkedInputStream wie java.net.HttpURLConnection hinter den Kulissen tut.

Diese Implementierung bietet keine detaillierten Ausnahmen (Zeilennummern) für falsches Inhaltsformat.

Es funktioniert mit Java 8, könnte aber mit der nächsten Version fehlschlagen. Du wurdest gewarnt.

Konnte für Prototyping obwohl nützlich sein.

Sie können eine readFully Implementierung von Convert InputStream to byte array in Java wählen.

Verwandte Themen