2010-09-28
■[Webサービス]Jerseyで、Restサービスの呼び出し方法
Jerseyで、Restサービスの呼び出し方法に関して、まだ書いてなかったので、書いておこうと思います。
この場合もレスポンスとして、XMLが戻ってくる場合は、基本的にJAXBで、XMLをJavaクラスにバインドします。
まず、呼び出しを行うWebResourceオブジェクトを生成します。
WebResourceオブジェクトの生成には、手順があります。
Clinetクラスは、createメソッドでClientクラスのオブジェクトを取得することができます。
createメソッドは、引数として、ClientConfigクラスのオブジェクトが必要です。
例としては、下記の様にClientクラスのオブジェクトを取得します。
ClientConfig config = new DefaultClientConfig(); Client client = Client.create(config);
取得したClientクラスのオブジェクトを使いWebResourceクラスのオブジェクトを取得します。
ClientクラスにあるresourceメソッドからWebResourceクラスのオブジェクトを取得できます。
resorceメソッドは、引数として、UriBuilderクラスを利用して、Restサービスの呼び出しURLをbuildしたオブジェクトが必要です。
例としては、下記の様にWebResourceクラスのオブジェクトを取得します。
String url = "http://localhost/rest/Message/service/getMessage"; WebResource resource = client.resource(UriBuilder.fromUri(url).build());
WebResourceクラスのオブジェクトができれば、呼び出しを行うことが可能になります。
呼び出しを行うURLに「messageId=100」みたなクエリーパラメータが必要な場合があると思います。
その場合は、WebResourceクラスのqueryParamメソッドかqueryParamsメソッドを使います。
クエリーパラメータが一つしかない場合は、queryParamメソッドを使い、複数ある場合は、queryParamsメソッドを使います。
また、XMLなのかJSONなのか、どの形式で戻ってくるか指定する必要があります。
これもWebResourceクラスのacceptメソッドに形式を指定します。
MediaTypeクラスに定数が定義してあり、XMLの場合、TEXT_XML_TYPEになります。
最後に、JAXBのクラスをgetメソッドに指定して呼び出しを行います。
呼び出し例は、下記の記述になります。
MessageResponse response = resource.queryParam("messageId", 100).accept(MediaType.TEXT_XML_TYPE).get(MessageResponse.class);
ちなみに、サービス側で、例外が発生した場合もXML形式で例外内容が戻ってくる場合に関してもJAXBでバインドすることが可能です。
HTTPステータスコードが400の場合、ApplicationFault、500の場合、SystemFaultとして、それ用のXMLで戻ってくるようなサービスとして、
Restサービスを組んである場合は、
呼び出し側で、HTTPステータスコードが400の場合JAXBで生成したApplicationFaultクラスにバインドしたり、500の場合は、SystemFaultクラスにバインドしたりできます。
サービス側で、例外が発生した場合は、WebResourceクラスは、UniformInterfaceExceptionがスローされます。
その例外をキャッチして、JAXBにバインドします。
バインドするには、まず何が戻ってきているかを確認する必要があります。
HTTPステータスコードを確認して、どのJAXBクラスにバンドするかを決めます。
HTTPステータスコードを確認するには、UniformInterfaceExceptionからResponseクラスのオブジェクトを取得して、getStatusメソッドで判断します。
HTTPステータスコードがわかったら、ResponseクラスのgetEntityメソッドにJAXBクラスを指定すればXMLをJAXBクラスへバインドすることができます。
下記の様に記述します。
try {
MessageResponse response = resource.queryParam("messageId", 100).accept(MediaType.TEXT_XML_TYPE).get(MessageResponse.class);
} catch (UniformInterfaceException ex) {
if (ex.getResponse().getStatus() == 400) {
ApplicationFault fault = ex.getResponse.getEntity(ApplicationFault.class);
// なんらかの例外処理
} else if (ex.getResponse.getStatus() == 500) {
SystemFault fault = ex.getResponse.getEntity(SystemFault.class);
// なんらかの例外処理
}
}
- 8 http://search.minakoe.jp/rsss/rsss.asp?pgsz=100&qry=java¬wit=1&twit=0&debug=1&multi=1
- 1 http://d.hatena.ne.jp/keyword/御殿場アウトレット
- 1 http://d.hatena.ne.jp/keyword/Java
- 1 http://images.google.co.jp/imgres?imgurl=http://f.hatena.ne.jp/images/fotolife/c/chronos_devel/20100902/20100902233512.jpg&imgrefurl=http://d.hatena.ne.jp/chronos_devel/20100903/1283438666&usg=__qVmSGwtlJEEvuPsdgK__EXuNo34=&h=800&w=599&sz=251&hl=ja&start=
- 1 http://k.hatena.ne.jp/keywordblog/Java?page=6
- 1 http://reader.livedoor.com/reader/
- 1 http://search.yahoo.co.jp/search?p=PHP+インストール+5.2.14&aq=-1&oq=&ei=UTF-8&fr=slv1-ytpie8&x=wrt
- 1 http://www.google.co.jp/
- 1 http://www.google.co.jp/imgres?imgurl=http://f.hatena.ne.jp/images/fotolife/c/chronos_devel/20100902/20100902233511.jpg&imgrefurl=http://d.hatena.ne.jp/chronos_devel/20100903/1283438666&usg=__u5Mh3VjbFcKoTez1yxzkl5_58BE=&h=600&w=800&sz=257&hl=ja&start=0&z
- 1 http://www.google.co.jp/search?hl=ja&biw=995&bih=554&q=池袋+麺屋武蔵&aq=4&aqi=g5&aql=&oq=池袋+麺&gs_rfai=