2010年1月9日土曜日

CXF/REST/Galileo

CXF で RESTful Web サービスを書いて、Eclipse で動かしてみる getting started。

■ 使うもの
・Eclipse 3.5 Galileo + m2eclipse

■ やりたい事
JSR 311準拠の REST を、CXF を使ってやってみる。

JSR 311: JAX-RS: Java API for RESTful Web Services  疎通確認程度の、なるべくコンパクトなコードにしたいが、GET だけだとアレなので PUT での更新も試してみる。

方針としては、簡易サーバ上のサービスに対して、ブラウザで GET して、HttpClient を使ったクライアントで PUT する。

■ プロジェクト作成
  • archetype-maven-quickstart で Maven Projectを作る。
  • pom.xml に 以下を追加
    org.apache.cxfcxf-rt-frontend-jaxrs2.2.5
    org.apache.cxfcxf-rt-transports-http2.2.5
    org.apache.cxfcxf-rt-transports-http-jetty2.2.5
    commons-httpclientcommons-httpclient3.1
■ サーバアプリ作成
◆ やり取りする REST メッセージは以下の二つ
@XmlRootElement(name = "Message")
public class Message {
  private String text;
  // ・・・ getter/setter 略
  public void setText(String greeting, String name) {
    setText(String.format("%1$s, %2$s!", greeting, name));
  }
}
@XmlRootElement(name = "Greeting")
public class Greeting {
  private String word;
  // ・・・ getter/setter 略
}
◆ サービスクラスはこんな感じ
@Path("/greetingservice/")
public class GreetingService {
  private String greeting = "Hello";
    @GET
    @Path("/greeting/{name}/")
    public Message getMessage(@PathParam("name") String name) {
      Message hello = new Message();
      hello.setText(greeting, name);
      
      return hello;
    }
    @PUT
    @Path("/greeting/")
    public Response updateGreeting(Greeting greeting) {
      this.greeting = greeting.getWord();
        return Response.ok().build();
    }
}
◆ このサービスクラスを動かす簡易サーバ
public class App {
  public static void main(String[] args) throws Exception {
    JAXRSServerFactoryBean sf = new JAXRSServerFactoryBean();
    sf.setResourceClasses(GreetingService.class);
    sf.setResourceProvider(GreetingService.class,
        new SingletonResourceProvider(new GreetingService()));

    sf.setAddress("http://localhost:9000/");
    sf.create();

    new BufferedReader(new InputStreamReader(System.in)).readLine();
    System.exit(0);
  }
}
◆ 動作確認
GET だけならこの時点でブラウザから確認できる。
http://localhost:9000/greetingservice/greeting/World
こんなXML が返ってくる
<Message>
  <text>Hello, World!</text>
</Message>
あるいは URL がこうならば、、
http://localhost:9000/greetingservice/greeting/Europa
、、このようになる。
<Message>
  <text>Hello, Europe!</text>
</Message>
■ クライアントコード
◆コード
public final class Client {
  public static void main(String args[]) throws Exception {
    PutMethod put = new PutMethod(
        "http://localhost:9000/greetingservice/greeting");
    String content = String.format(
        "<Greeting><word>%s</word></Greeting>", args[0]);
    RequestEntity entity = 
        new StringRequestEntity(content, "text/xml", "UTF-8");
    put.setRequestEntity(entity);
    try {
      HttpClient httpclient = new HttpClient();
      int result = httpclient.executeMethod(put);
      System.out.println("Response status code: " + result);
    } finally {
      put.releaseConnection();
    }
  }
}
◆ 実行
サーバが起動されている状態で、Program Argument に "Good-Bye"を指定して、上記クライアント・コードを実行。正常終了すれば、PUT リクエストが送られたことになる。

ここで再び、ブラウザから http://localhost:9000/greetingservice/greeting/Asia に GET リクエストを送る。
<Message>
  <text>Good-Bye, Asia!</text>
</Message>
今度は Hello ではなくGood-Bye と表示されるのが確認できる。

■ 所感
  • いい感じの EoD で、上のような疎通確認程度ならほとんど勘で充分。
  • 他の CRUD も同じ要領でできそう。
  • 今回、CFX 付属の sample を参考にして、JAXRSServerFactoryBean で Server endpoints を生成する簡易サーバで動かしたが、Web アプリにするやり方も確認したい。

0 件のコメント:

コメントを投稿