2010-09-15 37 views
5

Tôi đang giải mã các gói http. Và tôi phải đối mặt với một vấn đề mà vấn đề chunk. Khi tôi nhận được gói http, nó có tiêu đề và nội dung. Khi mã hóa mã vạch bị cắt xén Tôi không biết phải làm gì?Giải mã http chunked trong java?

Có API hoặc lớp học hữu ích để dechunk dữ liệu trong JAVA không?

Và nếu ai đó, có kinh nghiệm về giải mã http, vui lòng chỉ cho tôi cách làm điều này?

Trả lời

11

Sử dụng ứng dụng khách HTTP đầy đủ như Apache HttpComponents Client hoặc chỉ Java SE được cung cấp java.net.URLConnection (mini tutorial here). Cả hai xử lý nó hoàn toàn minh bạch và cung cấp cho bạn một "bình thường" InputStream trở lại. HttpClient lần lượt cũng đi kèm với một ChunkedInputStream mà bạn chỉ cần có để trang trí InputStream của bạn với.

Nếu bạn thực sự nhấn mạnh trong việc phát triển một thư viện cho việc này, thì tôi khuyên bạn nên tạo một lớp như ChunkedInputStream extends InputStream và viết logic cho phù hợp. Bạn có thể tìm thêm chi tiết cách phân tích cú pháp trong số this Wikipedia article.

+0

Thực ra tôi thực hiện giải mã http ngoại tuyến và tôi chỉ có tiêu đề và nội dung của gói http. Và tôi sẽ giải mã gói tin. Nhưng tôi cần một api được tiêu đề và cơ thể và cho tôi dữ liệu được giải mã. Có api không? – CodingForever

+0

Bài viết trên Wikipedia chứa chi tiết cách một đoạn trông giống như thế nào. Về cơ bản bạn có thể chia nhỏ trên CRLF (\ r \ n). Đó là các byte 10 và 13. Phần đầu tiên sau đó là tiêu đề đại diện cho chiều dài đoạn trong hex. Phần thứ hai là chính bản thân dữ liệu. Bạn chỉ cần thu thập và ghép tất cả các khối đó. 'ChunkedInputStream' thực hiện chính xác điều đó. – BalusC

+0

vì câu trả lời của bạn là đúng. – CodingForever

1

Apache HttpComponents

Oh, và nếu chúng ta đang nói về phía khách hàng, HttpUrlConnection thực hiện điều này là tốt.

+0

Tôi sẽ giải mã http ngoại tuyến (các gói đã chụp) và tôi chỉ có tiêu đề và nội dung. Vì vậy, tôi cần một api mà chỉ là tiêu đề và cơ thể và cho tôi giải mã dữ liệu. Có api nào như thế này không? – CodingForever

1

Nếu bạn đang tìm kiếm một API đơn giản, hãy thử Jodd Http thư viện (http://jodd.org/doc/http.html). Nó xử lý mã hóa chuyển Chunked cho bạn và bạn có được toàn bộ cơ thể như một chuỗi trở lại.

Từ các tài liệu:

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

System.out.println(response); 
1

Đây là sự thay thế nhanh chóng-và-bẩn mà không cần phụ thuộc ngoại trừ 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); 
} 

Nó sử dụng cùng sun.net.www.http.ChunkedInputStream như java.net.HttpURLConnection làm đằng sau hiện trường.

Triển khai này không cung cấp ngoại lệ chi tiết (số dòng) trên định dạng nội dung sai.

Nó hoạt động với Java 8 nhưng có thể không thành công với bản phát hành tiếp theo. Mày đã được cảnh báo.

Có thể hữu ích khi tạo mẫu.

Bạn có thể chọn bất kỳ triển khai readFully nào từ Convert InputStream to byte array in Java.

Các vấn đề liên quan