Apache HttpClient 5 の使用方法まとめ

# はじめに
以前、Http Client 4にバージョンアップした頃、それ以前のバージョンで使用されていた方法が非推奨になっていたりして、ネット上の情報があまり参考にならなかった経験がありました。
それでも、Http Client 4の頃はサンプルが添付されていたので、それを見て何とか解決できました。
そして、Http Client 5になって、更に、``HttpClient#execute(httpGet)``が非推奨になったり、それ以外にも、今までのコードが動かなかったり、ということが結構ありました。
公式サイトの[マイグレーションガイド](https://hc.apache.org/httpcomponents-client-5.3.x/migration-guide/preparation.html)が微妙に動かなかったりもしました。

最近はApache HttpClientを用いることが少なくなったのか情報があまりない気がするので、こちらに軽くまとめ記事を投稿したいと思います。

# 通常のPOST
```java
CloseableHttpClient httpclient = HttpClients.createDefault();
List<NameValuePair> nvps = new ArrayList<NameValuePair>();
// リクエストパラメータの設定
nvps.add(new BasicNameValuePair("param1", "パラメータ１"));
nvps.add(new BasicNameValuePair("param2", "パラメータ２"));

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
```java
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", "パラメータ１", textContentType);
multipartEntityBuilder.addTextBody("param2", "パラメータ２", 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の内容）に関する処理を行う
//...
```
# ファイルのダウンロード
```java
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とファイルのダウンロードのパターンを上げましたが、ここで取り上げた以外のパターンなど、具体的なサンプルは以下の公式サイトにいろいろあるので、そちらを見ていけば解決できるかもしれません。

https://hc.apache.org/httpcomponents-client-5.3.x/examples.html