Java Apache HttpClient 4.5 の導入と基本操作

投稿者 : OSCA

[PR] "出川哲朗の充電させてもらえませんか?"で登場したロケ地を紹介するファンサイト「あの場所へ行こう!」はこちら。

概要

 Java のHTTPクライアントとして有名なライブラリとして、Apache Software Foundation で開発されている Apache HttpComponents の HttpClient があります。 その歴史はとても長く、利用しているシステムもとても多いでしょう。 しかしながら Apache HttpClient はクラスインターフェースの変更が頻繁に行われ、マイナーバージョンのアップデートでも大きな変更が行われます。 ここでは、HttpClient 4.5 の基本的な操作についてまとめます。

インストール

 プロジェクトで Apache Maven を利用している場合は、pom.xml に次のように依存関係を追加しましょう。

<dependency>
  <groupId>org.apache.httpcomponents</groupId>
  <artifactId>httpclient</artifactId>
  <version>4.5.4</version>
</dependency>

GETリクエスト

 まずは、シンプルにGETリクエストを投げてみましょう。 サンプルプログラムは次の通りです。

package sample.sample_httpclient;

import org.apache.http.HttpStatus;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;

public class App {
    public static void main( String[] args ) {
        try( CloseableHttpClient httpClient = HttpClients.createDefault(); ) {
            // HTTPリクエストの設定を行います。
            // ここでは例としてタイムアウトの時間を設定します。
            RequestConfig config = RequestConfig.custom()
                .setSocketTimeout(3000)
                .setConnectTimeout(3000)
                .build();

            // HTTPのGETリクエストを構築します。
            // ここでは例としてHTTPヘッダ(User-Agent)と設定をセットします。
            HttpGet httpGet = new HttpGet("https://www.yahoo.co.jp");
            httpGet.addHeader("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36");
            httpGet.setConfig(config);

            // HTTPリクエストを実行します。 HTTPステータスが200の場合は取得したHTMLを表示します。
            try ( CloseableHttpResponse httpResponse = httpClient.execute(httpGet); ) {
                if( httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK ) {
                    System.out.println(EntityUtils.toString(httpResponse.getEntity()));
                }
                else {
                    System.out.println("200以外のステータスコードが返却されました。");
                }
            }
            catch(Exception exception) {
                throw exception;
            }
        }
        catch(Exception exception) {
            exception.printStackTrace();
        }
    }
}

 HttpClient 4.5 では、HttpClients.createDefault() メソッドで HttpClient オブジェクトを生成できます。 また、生成された HttpClient オブジェクトは、AutoClosable インターフェースを実装した CloseableHttpClient であるため、Java 7 で導入された try-with-resources 構文を利用することができます。

 HTTP通信に関する設定は、RequestConfig クラスを利用して行います。 ここでは SocketTimeout と ConnectTimeout の値(ミリ秒)を設定しています。 RequestConfig クラスでは、他にもリダイレクトの最大回数やプロキシを設定したりできます。

 HTTPリクエストの情報は HttpGet クラスで行います。 インスタンス化の方法はいくつかありますが、ここでは URL を引数にインスタンス化します。 細かいリクエストヘッダも HttpGet クラスで設定できます。 ここでは例として User-Agent ヘッダを指定しました。 アプリケーション固有のXヘッダなどがあれば、ここで設定することになります。

 サーバーへHTTPリクエストを送信するには、HttpClient クラスの execute() メソッドを利用します。 リクエストの結果となるHTTPレスポンスを戻り値で受け取ることができます。 返却されるレスポンスクラスも AutoClosable インターフェースを実装しているため、try-with-resources 構文を利用できます。 レスポンスを受け取ったら、まずはHTTPステータスを確認しましょう。 ここではHTTPステータスに 200 (OK) が返却されたことを確認し、返却された HTML 全文を EntityUtils クラスの toString() メソッドを利用して取得しています。

POSTリクエスト

 POSTリクエストの場合も、GETの場合とあまり変わりません。 key と value が対になる POST データは、UrlEncodedFormEntity クラスのインスタンスを作成して HttpPost オブジェクトに設定します。

package net.oscasierra.sample.sample_httpclient;

import java.util.ArrayList;
import java.util.List;

import org.apache.http.HttpStatus;
import org.apache.http.NameValuePair;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;

public class App {
    public static void main( String[] args ) {
        try( CloseableHttpClient httpClient = HttpClients.createDefault(); ) {
            // HTTPリクエストの設定を行います。
            // ここでは例としてタイムアウトの時間を設定します。
            RequestConfig config = RequestConfig.custom()
                .setSocketTimeout(3000)
                .setConnectTimeout(3000)
                .build();

            // フォームの項目としてPOSTパラメータを送信する設定をします。
            List formparams = new ArrayList();
            formparams.add(new BasicNameValuePair("name", "Tom"));
            formparams.add(new BasicNameValuePair("age", "20"));
            UrlEncodedFormEntity entity = new UrlEncodedFormEntity(formparams, "UTF-8");

            // HTTPのPOSTリクエストを構築します。
            // ここでは例としてHTTPヘッダ(User-Agent)と設定をセットします。
            HttpPost httpPost = new HttpPost("https://www.yahoo.co.jp");
            httpPost.addHeader("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36");
            httpPost.setConfig(config);
            httpPost.setEntity(entity);

            // HTTPリクエストを実行します。 HTTPステータスが200の場合は取得したHTMLを表示します。
            try ( CloseableHttpResponse httpResponse = httpClient.execute(httpPost); ) {
                if( httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK ) {
                    System.out.println(EntityUtils.toString(httpResponse.getEntity()));
                }
                else {
                    System.out.println("200以外のステータスコードが返却されました。");
                }
            }
            catch(Exception exception) {
                throw exception;
            }
        }
        catch(Exception exception) {
            exception.printStackTrace();
        }
    }
}

おわりに

 本稿では Apache HttpClient 4.5 の基本的な使い方についてサンプルプログラムとともに解説しました。 GET と POST の基本的なテンプレートになれば幸いです。

Java環境構築へ戻る

Javaのトップへ戻る

著者 : OSCA

OSCA

Java, PHP 系のWEBエンジニア。 WEBエンジニア向けコミュニティ「WEBエンジニア勉強会」を主催。 個人として何か一つでも世の中の多くの人に使ってもらえるものを作ろうと日々奮闘中。
@engineer_osca