Java apache HttpClient 4.3からの大幅なインターフェース変更に対応

  • 93
    Like
  • 0
    Comment
More than 1 year has passed since last update.

インターフェース変更

久しぶりにApache Jakarta HttpClientを利用してみたところ最新の4.3であまりにもインターフェースが変更されていて非推奨の警告ばかりでてきました。
警告なので当面は動作するのですが今後のことを考えて正しい使い方を調べてサンプルコードを作成してみました。

2013年11月現在、英語も含めてあまりサンプルソースコードが見つからないので参考にしたのは本家のJavaDocとソースコードを追って確認しました。
これまで使い慣れていた人にとってdeprecatedが多くなってしまうほどの大幅な変更です。

本家JavaDoc
https://hc.apache.org/httpcomponents-client-4.3.x/httpclient/apidocs/

大きな変更点として、実装面ではスレッド処理に強い実装になっていること、プログラミング記述上の変更点としては設定系がそれぞれクラスに分かれていることがあげられます。一度わかってしまえば新しい方がいい感じですので皆さんもぜひご利用ください。

ポイント

  • HttpClientのオブジェクトを利用するのはHttpClientBuilderを利用する
  • 接続設定やヘッダなどの設定にはConfigクラスを利用する

HttpClientインスタンスの作成

今までのHttpClientではDefaultHttpClientをそのままインスタンス化できました。

旧式の記述

old
  // configurations
  int socketTimeout = 3;
  int connectionTimeout = 3;
  String userAgent = "My Http Client 0.1";
  // create client
  HttpClient httpClient = new DefaultHttpClient();
  HttpParams params = httpClient.getParams();
  HttpConnectionParams.setConnectionTimeout(params, connectionTimeout);
  HttpConnectionParams.setSoTimeout(params, socketTimeout);
  method.setHeader("Accept-Charset", "utf-8");
  method.setHeader("Accept-Language", "ja");
  method.setHeader("User-Agent", userAgent);

4.3での記述

4.3のインターフェースでは分類されたConfigurationを作ってクライアントをビルドするという流れになっています。

HttpClient
  // configurations
  int socketTimeout = 3;
  int connectionTimeout = 3;
  String userAgent = "My Http Client 0.1";
  // request configuration
  RequestConfig requestConfig = RequestConfig.custom()
      .setConnectTimeout(connectionTimeout)
      .setSocketTimeout(socketTimeout)
      .build();
  // headers
  List<Header> headers = new ArrayList<Header>();
  headers.add(new BasicHeader("Accept-Charset","utf-8"));
  headers.add(new BasicHeader("Accept-Language","ja, en;q=0.8"));
  headers.add(new BasicHeader("User-Agent",userAgent));
  // create client
  HttpClient httpClient = HttpClientBuilder.create()
      .setDefaultRequestConfig(requestConfig)
      .setDefaultHeaders(headers).build();

冗長に感じるかもしれませんが、これまでよりロジカルな流れでできるので好ましいように感じます。自身のインスタンスが返されて設定をappendのように追加できるのもいい感じですね。

リダイレクトや回数を指定する場合もRequestConfigで設定できます。

Redirect
  // request configuration
  RequestConfig requestConfig = RequestConfig.custom()
      .setCircularRedirectsAllowed(true)
      .setMaxRedirects(30)
      .setRedirectsEnabled(true)
      .build();

リクエスト送信と結果取得

この部分はこれまで通りのやり方です。

GET
  HttpGet httpGet = new HttpGet();
  HttpResponse response = httpClient.execute(method);  
  int responseStatus = response.getStatusLine().getStatusCode();
  String body = EntityUtils.toString(response.getEntity(), "UTF-8");
POST
  HttpPost method = new HttpPost(url);
  List<NameValuePair> requestParams = new ArrayList<NameValuePair>();
  requestParams.add(new BasicNameValuePair("foo","var");
  method.setEntity(new UrlEncodedFormEntity(requestParams));  
  HttpResponse response = httpClient.execute(method);  
  int responseStatus = response.getStatusLine().getStatusCode();
  String body = EntityUtils.toString(response.getEntity(), "UTF-8");

とりあえず今回はこのくらいで。