2010-09-15 18 views
5

Dekoduje pakiety http. I stanąłem przed problemem, który jest problemem. Kiedy otrzymam pakiet http, ma on nagłówek i treść. Kiedy kodowanie transeferów jest porwane, nie wiem, co zrobić?Chunked dekodowanie http w java?

Czy istnieje przydatne API lub klasa dla dechunk danych w JAVA?

A jeśli ktoś, doświadczony w zakresie dekodowania http, proszę pokazać mi, jak to zrobić?

Odpowiedz

11

Użyj pełnowartościowego klienta HTTP, takiego jak Apache HttpComponents Client lub tylko Java SE pod warunkiem java.net.URLConnection (mini tutorial here). Oba obsługuje go w pełni przezroczysty i daje "normalny" powrót do tyłu. HttpClient z kolei jest dostarczany z ChunkedInputStream, który musisz tylko udekorować swoim InputStream.

Jeśli naprawdę nalegasz na nakłonienie biblioteki do tego, wtedy proponuję utworzyć klasę taką jak ChunkedInputStream extends InputStream i odpowiednio napisać logikę. Możesz znaleźć więcej szczegółów, jak je przetworzyć w this Wikipedia article.

+0

Właściwie robię offline dekodowanie http i mam właśnie nagłówek i treść pakietu http. I będę dekodować pakiet. Ale potrzebuję api, który dostaje nagłówek i ciało i daje mi zdekodowane dane. Czy jest taki api? – CodingForever

+0

Artykuł w Wikipedii zawiera szczegółowe informacje na temat wyglądu kawałka. Możesz zasadniczo podzielić się na CRLF (\ r \ n). Są to bajty 10 i 13. Pierwsza część to nagłówek, który reprezentuje długość fragmentu na heksie. Druga część to same dane porcji. Po prostu zbierasz i łączysz wszystkie te kawałki. '' ChunkedInputStream' robi dokładnie to. – BalusC

+0

, ponieważ twoja odpowiedź jest właściwa. – CodingForever

1

Apache HttpComponents

Aha, i jeśli mówimy o stronie klienta, HttpUrlConnection robi to za dobrze.

+0

Będę dekodowany w trybie offline (już przechwycone pakiety) i mam tylko nagłówek i treść. Potrzebuję więc api, który dostaje właśnie nagłówek i treść i daje mi zdekodowane dane. Czy jest coś takiego? – CodingForever

1

Jeśli szukasz prostego API spróbować Jodd Http biblioteki (http://jodd.org/doc/http.html). Obsługuje kodowanie transferowe Chunked dla ciebie i otrzymujesz całe ciało jako ciąg z powrotem.

Od docs:

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

System.out.println(response); 
1

Oto szybki i-brudny alternatywa, która nie wymaga uzależnienia oprócz Oracle JRE:

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

używa tego samego sun.net.www.http.ChunkedInputStream jak java.net.HttpURLConnection robi za sceną.

Implementacja ta nie zapewnia szczegółowych wyjątków (numerów linii) w niewłaściwym formacie zawartości.

Działa z Javą 8, ale może zawieść z następną wersją. Zostałeś ostrzeżony.

Może być jednak przydatny do prototypowania.

Możesz wybrać dowolną implementację readFully z Convert InputStream to byte array in Java.