■ 使うもの
・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 件のコメント:
コメントを投稿