6 JAX-RS 2.0のクライアントAPIの利用
JAX-RS 2.0における注目すべき変更点の一つが、クライアント用のAPIが追加されたことである。これまでのJAX-RSではRESTful Webサービスのサーバー側の実装にしか対応しておらず、クライアント側は依然としてJava標準のHTTPクライアントAPIで実装するか、サードパーティ製の非標準のライブラリを利用するしかなかった。それに対してJAX-RS 2.0では、サーバーからクライアントまで一貫して標準APIだけで容易に実装できるようになったわけでだ。
そこで今度は、先ほど作成したZipcodeServiceに対して、JAX-RS 2.0のクライアントAPIを使ってリクエストを送ってみることにする。クライアントAPIを使ったリクエストの基本的な手順は次のようになる。
- Clientクラスのインスタンスを作成する
- リクエスト対象のURLを指定してWebTargetインスタンスを作成する
- リクエスト用のエンティティをEntityインスタンスとして作成する
- WebTargetからリクエストを処理するためのInvocation.Builderインスタンスを作成する
- Invocation.Builderを使ってリクエストを発行
以上を踏まえて、ZipcodeServiceのjsonserachを利用するスタンドアロンなJavaプログラムを次のように実装した。
public class JsonClientTest {
public static void main(String[] args) {
// リクエストターゲット
Client client = ClientBuilder.newClient();
WebTarget target = client.target("http://localhost:9080/ZipcodeService/ws/address/jsonsearch");
String jsonText = "{\"zip\":\"5220002\"}"; // リクエスト用JSONデータの例
// Entityとレスポンスの型を指定してリクエストを発行
Entity<String> entity = Entity.entity(jsonText, MediaType.APPLICATION_JSON_TYPE);
String response = target.request(MediaType.APPLICATION_JSON_TYPE).post(entity, String.class);
System.out.println(response);
}
}
ClientインスタンスはClientBuilderクラスのnewClient()メソッドで作成する。そして作成したClientインスタンスに対してtarget()メソッドを呼び出すことでWebTargetインスタンスが取得できる。リクエスト用のEntityはstaticなentity()メソッドを使って作成する。このメソッドには第1引数にエンティティデータ本体を、第2引数にエンティティデータのタイプを指定すればよい。ここではJSONデータを指定している。
続いてWebTargetに対してrequest()メソッドを実行するとInvocation.Builderインスタンスが取得できるので、そこからpost()メソッドを実行することでリクエストを発行している。post()メソッドには引数としてEntityインスタンスと、レスポンスを受け取る型(この例ではString型)を指定する。
このプログラムを実行すると、次のようなJSONデータが返ってくるはずだ。
[
{ "address" : "滋賀県彦根市松原",
"id" : "0075683",
"zip" : "5220002" },
{ "address" : "滋賀県彦根市松原町",
"id" : "0075684",
"zip" : "5220002"}
]
なお、Java EE 7を使わずにJAX-RS 2.0を単体で利用したい場合には、このサイトから参照実装をダウンロードすることができる。

