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.
Atur pengkodean respons dengan HttpClient 3.1
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.
Beberapa catatan:
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.
Jika opsi 1. tidak berhasil, maka Anda harus melihat konfigurasi server.
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.
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
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.
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
response
itu.
- person michal.kreuzman; 10.03.2011
Servlet
jadi tidak ada HttpServletResponse
.
- person michal.kreuzman; 17.03.2011