はじめに
以前、Http Client 4にバージョンアップした頃、それ以前のバージョンで使用されていた方法が非推奨になっていたりして、ネット上の情報があまり参考にならなかった経験がありました。
それでも、Http Client 4の頃はサンプルが添付されていたので、それを見て何とか解決できました。
そして、Http Client 5になって、更に、HttpClient#execute(httpGet)
が非推奨になったり、それ以外にも、今までのコードが動かなかったり、ということが結構ありました。
公式サイトのマイグレーションガイドが微妙に動かなかったりもしました。
最近はApache HttpClientを用いることが少なくなったのか情報があまりない気がするので、こちらに軽くまとめ記事を投稿したいと思います。
通常のPOST
CloseableHttpClient httpclient = HttpClients.createDefault();
List<NameValuePair> nvps = new ArrayList<NameValuePair>();
// リクエストパラメータの設定
nvps.add(new BasicNameValuePair("param1", "パラメータ1"));
nvps.add(new BasicNameValuePair("param2", "パラメータ2"));
HttpEntity postEntity = new UrlEncodedFormEntity(nvps, Charset.forName("UTF-8"));
// URLを設定
String url = "http://.....";
HttpPost httppost = new HttpPost(url);
httppost.setEntity(postEntity);
Object result = httpclient.execute(httppost, response -> {
// Status Lineの出力
System.out.println(new StatusLine(response).toString());
// ステータスコードの取得
int statusCode = response.getCode();
if (statusCode == 200) {
HttpEntity entity = response.getEntity();
// レスポンスのbodyを文字列で取得
return (Object)EntityUtils.toString(entity, "UTF-8");
} else {
//...
}
});
// 以降、resultの内容(レスポンスbodyの内容)に関する処理を行う
//...
multipart/form-dataのPOST
CloseableHttpClient httpclient = HttpClients.createDefault();
// multipart/form-dataを扱うための設定
MultipartEntityBuilder multipartEntityBuilder = MultipartEntityBuilder
.create();
multipartEntityBuilder.setCharset(Charset.forName("UTF-8"));
// これを行わないと日本語ファイル名が化ける
//(http client4の時と設定内容が変わっているので注意)
multipartEntityBuilder.setMode(HttpMultipartMode.LEGACY);
// テキスト文字列を設定するときのContentTypeを生成
ContentType textContentType = ContentType.create("text/plain",
"UTF-8");
// 通常のパラメータの場合
multipartEntityBuilder.addTextBody("param1", "パラメータ1", textContentType);
multipartEntityBuilder.addTextBody("param2", "パラメータ2", textContentType);
// バイナリデータの場合
// addBinaryBodyでバイナリデータを追加できる
// この例ではファイルを指定しているが、byte列やInputStreamなど、様々なパターンが用意されている
multipartEntityBuilder.addBinaryBody("file1", new File("c:\\Temp\\サンプル.txt"),
ContentType.DEFAULT_BINARY, "サンプル.txt");
// URLを設定
String url = "http://.....";
HttpPost httppost = new HttpPost(url);
httppost.setEntity(multipartEntityBuilder.build());
Object result = httpclient.execute(httppost, response -> {
// 以下、通常のPOSTと同様の処理を行う
//...
});
// 以降、resultの内容(レスポンスbodyの内容)に関する処理を行う
//...
ファイルのダウンロード
CloseableHttpClient httpclient = HttpClients.createDefault();
// 以下、HttpGet、もしくは、HttpPostを生成
//...
httpclient.execute(httppost, response -> {
// Status Lineの出力
System.out.println(new StatusLine(response).toString());
// ステータスコードの取得
int statusCode = response.getCode();
if (statusCode == 200) {
Header header = response.getHeaders("Content-Disposition")[0];
// ファイル名の取得(UTF-8の場合)
String fileName = URLDecoder.decode(header.getValue()
.replaceFirst("^.*filename\\*=UTF-8''", ""),
"UTF-8");
// レスポンスボディのバイト列を取得
HttpEntity entity = response.getEntity();
byte[] bytes = EntityUtils.toByteArray(entity);
// ファイルに出力
Path path = Paths.get("c:\\Temp\\" + fileName);
Files.write(path, bytes);
} else {
//...
}
});
最後に
ここでは、通常のPOSTとmultipart/form-dataとファイルのダウンロードのパターンを上げましたが、ここで取り上げた以外のパターンなど、具体的なサンプルは以下の公式サイトにいろいろあるので、そちらを見ていけば解決できるかもしれません。