0
0

Apache HttpClient 5 の使用方法まとめ

Posted at

はじめに

以前、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とファイルのダウンロードのパターンを上げましたが、ここで取り上げた以外のパターンなど、具体的なサンプルは以下の公式サイトにいろいろあるので、そちらを見ていけば解決できるかもしれません。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0