第26夜 Javaの高機能HTTPクライアント その2

24夜Javaの高機能HTTPクライアントの続き。

前回は引数も何もなしのgetだけやった。今回はパラメータを渡してみよう。


その前に受け取り側のサーバーのコードを書いておく。JAX-RSが楽なのでJAX-RSで。JavaSEのスタンドアロンサーバーで動かしたりJavaEE 6準拠のGlassfish V3で動かしたりTomcat 6でも動かせるので詳しく知りたい人は過去のエントリを参考にどうぞ。

package jaxrs;

import javax.ws.rs.FormParam;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.POST;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.UriInfo;


@Path("add")
public class AddResource {
    //リクエストされたURI情報を注入
    @Context
    UriInfo info;
    
    //--------------------------------------------------------------------------
    //フォーム送信を受け取る
    @POST
    @Produces(MediaType.TEXT_PLAIN)
    public String post(@FormParam("param1")int param1,@FormParam("param2")int param2) {

        return format("POST", param1,param2);
    }
    //--------------------------------------------------------------------------
    //クエリパラメータ(?param1=10&param2=20みたいな)を受け取る
    @GET
    @Produces(MediaType.TEXT_PLAIN)
    public String get(@QueryParam("param1")int param1,@QueryParam("param2")int param2)  {

        return format("GET", param1,param2);
    }

    //--------------------------------------------------------------------------
    //パスパラメータ(add/100/200みたいな)を受け取る
    @GET
    @Path("{param1}/{param2}")
    @Produces(MediaType.TEXT_PLAIN)
    public String path(@PathParam("param1")int param1,@PathParam("param2")int param2)  {
        return format("PATH", param1,param2);

    }

    //書式付け
    private String format(String Method,int param1 ,int param2){

        return String.format("%s%n%s:%d+%d=%d",
                info.getRequestUri(),//リクエストのURLを表示
                Method,
                param1,param2 , param1 + param2);
    }
}

細かい動きはわからなくてもいいけど、POSTとGET、そしてパスによるパラメータを渡して足し算の結果がtext/plainで返ってくるというシンプルなもの。


ではここから本編。それぞれに対応するクライアントのコード。

package client;

import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.WebResource;
import com.sun.jersey.api.representation.Form;
import javax.ws.rs.core.MediaType;

public class SendTest {

    public static void main(String[] args) {

        Client client = Client.create();
        WebResource wr = client.resource("http://localhost:8080/WebApplication20/resources/add");

        //フォーム送信の例
        {
            Form form = new Form();
            form.add("param1", 1);
            form.add("param2", 2);
            String result = wr.type(MediaType.MULTIPART_FORM_DATA_TYPE).
                    post(String.class, form);
            System.out.println(result);
        }

        //クエリパラメータ送信の例
        {
            String result = wr.
                    queryParam("param1", "10").
                    queryParam("param2", "20").
                    get(String.class);
            System.out.println(result);
        }
        
        //パスパラメータの例
        {
            String result = wr.
                    path("100").
                    path("200").
                    method("GET",String.class);
            System.out.println(result);
        }

    }

}


1つ目はPOST。WebResource に対してメソッドチェーンでパラメータを渡し最後にpostメソッドを呼ぶ。注意するのはフォーム送信の場合、multipart/form-dataをいれておくこと。定数クラスのMediaTypeを利用するとよい。

2つ目はGET。クエリパラメータをメソッドチェーンで直接渡している。

3つ目はパスパラメータ。pathというメソッドでパスが追加されていくのが面白い。getメソッドで終わらせるのは面白くないのでmethodで終わらせてみた。わかるとおり1つ目の引数に文字列で指定可能。変数でメソッドをかえるというのも気軽に出来るわけだ。


実行結果

run:
http://localhost:8080/WebApplication20/resources/add
POST:1+2=3
http://localhost:8080/WebApplication20/resources/add?param1=10&param2=20
GET:10+20=30
http://localhost:8080/WebApplication20/resources/add/100/200
PATH:100+200=300
構築成功 (合計時間: 0 秒)

見てわかるとおり非常にシンプルだ。Apacheなど古くからあるHTTPクライアントではこうはいかないだろう。

そして、今回のメインではないけどサーバーも非常にシンプル。たった1つのクラスだけでここまでできるフレームワークはそうそうない。