スキップしてメイン コンテンツに移動

Apache HttpClient で文字コードを指定する方法


Apache HttpClient で文字コードを指定する方法です。

#例は Post です。



public class PostTest { private CloseableHttpClient httpclient; public PostTest() { httpclient = HttpClients.createDefault(); } public String post(String url, List<NameValuePair> nvps, String charsetName) throws ClientProtocolException, IOException { Charset charset = Charset.forName(charsetName); HttpPost httpPost = new HttpPost(url); httpPost.setEntity(new UrlEncodedFormEntity(nvps, charset)); CloseableHttpResponse response = httpclient.execute(httpPost); try { HttpEntity entity = response.getEntity(); String html = EntityUtils.toString(entity, charset); EntityUtils.consume(entity); return html; } finally { response.close(); } }
}


ソース中の
Charset charset = Charset.forName(charsetName);
new UrlEncodedFormEntity(nvps, charset)
のところでリクエストの文字コードを指定しています。

レスポンスの文字コードは
EntityUtils.toString(entity, charset)
で指定しています。


post() の引数は、
url に 対象 URL を、
charsetName に文字コードを指定します。
nvps はパラメータです。次のように指定します。

nvps = new ArrayList<NameValuePair>();
nvps.add(new BasicNameValuePair("param1", "value1"));
nvps.add(new BasicNameValuePair("param2", "value2"));
nvps.add(new BasicNameValuePair("param3", "value3"));


ちなみにクラスとして作って
CloseableHttpClient をインスタンス変数に持たせているのは
HttpClient に cookie 等を覚えてもらうためです。
これにより Post() を連続呼び出ししてもセッションなどが管理されます。
(このあたりは色々な書き方ができるようになっています。
 本格的に使う場合は公式のドキュメントを参照してください。
 ※個人的には書き方が色々ありすぎて混乱気味ですが。


追記
この PostTest クラスには close 処理が漏れていました。
もしご利用の際は下記を追加して finally などで呼び出してください。

public void close() throws IOException {
httpclient.close();
}

詳細はApache HttpClient で タイムアウト処理する際の注意に記載しています。