Hatena::ブログ(Diary)

クロノスの雪山とIT技術日記

2010-09-28

[]Jerseyで、Restサービスの呼び出し方法 23:02

Jerseyで、Restサービスの呼び出し方法に関して、まだ書いてなかったので、書いておこうと思います。

この場合もレスポンスとして、XMLが戻ってくる場合は、基本的にJAXBで、XMLJavaクラスにバインドします。

まず、呼び出しを行うWebResourceオブジェクトを生成します。

WebResourceオブジェクトの生成には、手順があります。

最初にClientクラスのオブジェクトが必要になります。

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);
        // なんらかの例外処理
      }
}
トラックバック - http://d.hatena.ne.jp/chronos_devel/20100928/1285682568