読者です 読者をやめる 読者になる 読者になる

Web系開発メモ

Java, SpringBoot, JavaScript, CSS, HTML などの記事を書いています。

Java:Google Http Client で HTTP通信

Java

Google の Http Client を使って、Java で HTTP通信をする方法を書いていこうと思います。

HTTP接続ライブラリの選択

Google Http Client では、HTTP接続ライブラリを次の3種類から選択できるようです。

  • NetHttpTransport(JDK の HttpURLConnection がベース)
  • ApacheHttpTransport(Apache HttpClient がベース)
  • UrlFetchTransport(Google App Engine SDKAPI がベース)

ライブラリによって、Google Http Client が使う低レベルのAPIが違ってきます。この記事では、1番上のライブラリを使うことにしています。

インストール

Maven や Gradle を使っている場合、次の依存性を追加します。

<dependency>
  <groupId>com.google.http-client</groupId>
  <artifactId>google-http-client</artifactId>
  <version>1.20.0</version>
</dependency>
compile 'com.google.http-client:google-http-client:1.20.0'

サンプルコード1(GET)

次のコードは、GET のリクエストを送信するサンプルです。

package ghc;

import java.io.IOException;

import com.google.api.client.http.GenericUrl;
import com.google.api.client.http.HttpRequestFactory;
import com.google.api.client.http.HttpResponse;
import com.google.api.client.http.HttpResponseException;
import com.google.api.client.http.javanet.NetHttpTransport;

public class Main {

  // 1. ファクトリーを作成(スレッドセーフ)
  static HttpRequestFactory fac
    = (new NetHttpTransport()).createRequestFactory();
  
  public static void main(String[] args) {
    HttpResponse res = null;
    try {
      // 2. リクエストの送信
      res = fac.buildGetRequest(
        new GenericUrl("http://google.co.jp/")
      ).execute();
      
      // 3. レスポンスの操作
      System.out.println(
        "Get response. [status=" + res.getStatusCode() + "]"
      );
      System.out.println(res.parseAsString());
    }
    catch (HttpResponseException e) {
      System.err.println(  // エラー発生時
        "Error. [staus=" + e.getStatusCode() + "]"
      );
      throw new RuntimeException(e);
    }
    catch (IOException e) {
      throw new RuntimeException(e);
    }
    finally {
      try { if (res != null) res.disconnect(); }
      catch (IOException e) {
        throw new RuntimeException(e);
      }
    }
  }
}

ちょっと例外処理が多くなってますが、コメントの 1. ~ 3. の箇所がポイントになります。

リクエストパラメータを送りたい場合は、URL にクエリ(例:?key1=val1&key2=val2)を付けます。

動作確認

サンプルプログラムを実行すると、レスポンスが次のように表示されます。

Get response. [status=200]
<!doctype html><html itemscope="" itemtype="http://schema.org/WebPage" lang="ja">・・・省略

サンプルコード2(GET以外)

POST などでパラメータや JSON などを送りたい場合は、サンプルコードの 2. を次のように変更します。

パラメータを送信

res = fac.buildRequest(
  "POST", new GenericUrl("http://....."),
  ByteArrayContent.fromString(
    "application/x-www-form-urlencoded",
    "key1=val1&key2=key2"  // パラメータ
  )
).execute();  

JSON を送信

res = fac.buildRequest(
  "POST", new GenericUrl("http://....."),
  ByteArrayContent.fromString(
    "application/json",
    "{\"key\":\"val\"}"  // JSON文字列
  )
).execute();  

HTTP メソッドは、上の "POST""PUT""DELETE" 等にすれば変更できます。

参考文献

HTTP Client のガイド で、特に参照したページをまとめました。