■ 使うもの
・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.cxf cxf-rt-frontend-jaxrs 2.2.5 org.apache.cxf cxf-rt-transports-http 2.2.5 org.apache.cxf cxf-rt-transports-http-jetty 2.2.5 commons-httpclient commons-httpclient 3.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 件のコメント:
コメントを投稿