Atur pengkodean respons dengan HttpClient 3.1

Saya menggunakan org.apache.commons.httpclient.HttpClient dan perlu mengatur pengkodean respons (untuk beberapa alasan server mengembalikan pengkodean yang salah dalam Tipe Konten). Cara saya adalah mendapatkan respons sebagai byte mentah dan mengonversi ke String dengan pengkodean yang diinginkan. Saya ingin tahu apakah ada cara yang lebih baik untuk melakukan ini (mis. setup HttpClient). Terima kasih atas sarannya.


person michal.kreuzman    schedule 28.02.2011    source sumber


Jawaban (4)


Saya rasa tidak ada jawaban yang lebih baik menggunakan HttpClient 3.x API.

Spesifikasi HTTP 1.1 menyatakan dengan jelas bahwa klien "harus" menghormati kumpulan karakter yang ditentukan dalam header respons, dan menggunakan ISO-8859-1 jika tidak ada kumpulan karakter yang ditentukan. HttpClient API dirancang dengan asumsi bahwa pemrogram ingin menyesuaikan dengan spesifikasi HTTP. Jelas sekali, Anda harus melanggar aturan dalam spesifikasi agar Anda dapat berbicara dengan server yang tidak patuh. Meskipun demikian, ini bukanlah kasus penggunaan yang menurut desainer API perlu didukung secara eksplisit.

Jika Anda menggunakan HttpClient 4.x, Anda dapat menulis ResponseHandler Anda sendiri untuk mengubah isi menjadi HttpEntity, dengan mengabaikan kumpulan karakter nosional pesan respons.

person Stephen C    schedule 28.02.2011

Beberapa catatan:

  1. Server menyajikan data, jadi terserah pada server untuk menyajikannya dalam format yang sesuai. Jadi pengkodean respons diatur oleh server, bukan klien. Namun, klien dapat menyarankan ke server format apa yang diinginkannya melalui Terima dan Terima-Charset:

    Accept: text/plain
    Accept-Charset: utf-8
    

    Namun, server http biasanya tidak mengkonversi antar format.

  2. Jika opsi 1. tidak berhasil, maka Anda harus melihat konfigurasi server.

  3. Ketika String dikirim sebagai byte mentah (dan selalu demikian, karena inilah yang dikirimkan oleh jaringan), selalu ada pengkodean yang ditentukan. Karena server menghasilkan byte mentah ini, server mendefinisikan pengkodeannya. Jadi, Anda tidak dapat mengambil byte mentah dan menggunakan pengkodean pilihan Anda untuk membuat sebuah String. Anda harus menggunakan pengkodean yang digunakan saat mengkonversi dari String ke byte.

person Peter Knego    schedule 28.02.2011
comment
Hai, Saya tidak memiliki server di bawah kendali saya dan server mengembalikan enconding yang salah dalam atribut Tipe-Konten (HttpClient.getResponseBodyAsString() mengambil pengkodean dari atribut Tipe-Konten di header respons). Saya sudah mencoba mengatur Accept dan Accept-Charset seperti yang Anda sebutkan di header permintaan tetapi tidak membantu saya. Jelas ada yang salah di server tetapi saya bukan pemiliknya jadi saya tidak bisa mengubahnya. - person michal.kreuzman; 28.02.2011
comment
Terima kasih ;). Lagi pula, mengapa Anda merasa terganggu dengan pengkodean karakter? Di java Anda dapat mengambil byte mentah dengan pengkodean apa pun dan menghasilkan String darinya. - person Peter Knego; 28.02.2011
comment
Saya hanya tidak suka cara melanggar aturan API, jadi saya ingin tahu kemungkinannya. - person michal.kreuzman; 28.02.2011

Penafian: Saya tidak begitu mengenal HttpClient, hanya membaca API.

Saya akan menggunakan metode eksekusi yang mengembalikan HttpResponse, lalu .getEntity().getContent(). Ini adalah aliran byte murni, jadi jika Anda ingin mengabaikan pengkodean yang diberitahukan oleh server, Anda cukup membungkus InputStreamReader Anda sendiri di sekitarnya.


Oke, sepertinya saya salah versi (tentu saja, ada terlalu banyak HttpClient kelas di luar sana).

Tapi sama seperti sebelumnya, hanya terletak di kelas lain: HttpMethod memiliki metode getResponseBodyAsStream(), yang sekarang Anda dapat membungkus InputStreamReader Anda sendiri. (Atau dapatkan seluruh array sekaligus, jika tidak terlalu besar, dan ubah menjadi String, seperti yang Anda tulis.)

Saya pikir mencoba mengubah respons dan membiarkan HttpClient menganalisisnya bukanlah cara yang tepat di sini.


Saya menyarankan untuk mengirim pesan ke administrator server/webmaster tentang rangkaian karakter yang salah.

person Paŭlo Ebermann    schedule 28.02.2011

Salam semuanya,

Kalau-kalau ada yang menemukan posting ini mencari di Google untuk mengatur HttpClient untuk menulis dalam UTF-8.

Baris kode ini seharusnya berguna...

response.setContentType("text/html; charset=UTF-8");

Terbaik

person HommeDeJava    schedule 10.03.2011
comment
Hai, terima kasih atas komentarnya. Bisakah Anda memposting sumber lengkap yang jelas apa objek response itu. - person michal.kreuzman; 10.03.2011
comment
Salam terima kasih! Saya pikir saya sudah cukup untuk mengatakan tanggapan HttpServletResponse - person HommeDeJava; 16.03.2011
comment
Hai, Saya menggunakan Apache HttpClient untuk mengunduh data. Saya tidak bekerja dengan Servlet jadi tidak ada HttpServletResponse. - person michal.kreuzman; 17.03.2011