JAX-RSの基本

はじめに



このAPIはJSR 311から生まれました:JAX-RS:RESTful Webサービス用のJavaAPI。JavaEE 6(Java EE 5で計画中)に含まれていました。 名前が示すように、RESTful Webサービスを開発するように設計されています。



この記事の主な目的は、読者にJAX-RS APIの基本を紹介することです。 当初、JAX-RSサービスを使用する際のフォームの動作に関するいくつかの問題について書く予定でした。 この技術に関してHabréに関してほとんど何も発見していないので、この記事の紹介を取り除くことに成功しないことに気付きました。



JAX-RS APIの基本、JBossからの実装が紹介され、Resteasyフレームワークのクライアント部分の簡単な紹介が行われます。





javax.ws.rs。*の一連のクラスで表されます。環境によって提供される最新のAppServerの場合( mavenで <scope>provided</scope>



を使用できます。サーブレットコンテナのアプリケーションにはいくつかの実装があります。





このテクノロジーにより、JAX-RS実装によって提供される特別なサーブレットを使用して、任意のBeanメソッドをエクスポートできます。 例を挙げましょう。 クライアント部分で使用するには、インターフェースを選択します。

 package com.example; import javax.ws.rs.*; @Path("/") public interface RestService { @GET @Path("echo") String echo(@QueryParam("q") String original); }
      
      







そして実装:

 package com.example; import javax.enterprise.ApplicationScoped; import javax.ws.rs.*; @ApplicationScoped @Path("/") public class Rest implements RestService{ @GET @Path("echo") @Override public String echo(@QueryParam("q") String original) { return original; } }
      
      







Bean自体については、その動作を説明する注釈がメソッドに追加されます。たとえば、 @Path



、このリソースへの相対パスまたは絶対パスを示します。 注釈グループ@GET



@POST



@PUT



@DELETE



は、このメソッドに関連するHTTP



リクエストのタイプを担当しHTTP







連載



明らかに、任意のデータを転送するには、シリアル化が必要です-オブジェクト表現からバイトのセットへのデータの変換。 Resteasyに注目して話を続けます。

この場合、シリアル化/逆シリアル化には特別なプロバイダーが使用されます。 @Produces



および@Consumes



は、結果/データコンテンツのMIMEタイプを示すために使用されます。 したがって、データクラスにはJAXBによって注釈を付ける必要があります。 JBoss AS 7の標準プロバイダーは、resteasy-jaxb-provider(xml-marshaller / unmarshaller)およびresteasy-jettison-provider(json)です。 これら2つのプロバイダーを使用すると、多数の外部サービスと統合して、XMLおよびJSON APIを外部に提供できます。



カスタム回答



非標準の応答またはHTTPコードを返したい場合はどうしますか? 注釈付きのJAX-RSメソッドから例外がスローされた場合、結果は500エラーになります。 カスタマイズするにはjavax.ws.rs.core.Response



返される型javax.ws.rs.core.Response



を指定するだけで十分です。

 @GET @Path("file/get/{name}") Response getFile(@PathParam("file") String fileName) { if(!Files.exists(Paths.get(fileName)) { return Response.status(422).entity("I'm a teapot"); } else { Response.Builder response = Response.ok(); response.header("X-Some-Server-Header", "value"); response.entity(new StreamingOutput() { @Override public void write(OutputStream outputStream) throws IOException, WebApplicationException { Files.copy(Paths.get(fileName), outputStream); } }); return response.build(); } }
      
      







クライアントフレームワーク



JBoss Resteasyの2つ目の良い点は、便利なクライアントフレームワークの存在です。 低レベルのClientRequest



ClientResponse<T>



から、注釈付きのJAX-RSインターフェースを介したプロキシオブジェクトの生成まで、さまざまな抽象化レベルで作業できます。 たとえば、最初の例のRestService



インターフェイスを使用します。

 RestService service = ProxyFactory.create(RestService.class, "http://localhost:8080/example"); log.info(service.echo("test message"));
      
      







しかし、時にはこれで十分ではありません。 たとえば、この場合、サーバー側エラーが発生すると、プロキシは例外をスローします。 低レベルの作業には、Apache httpcomponents(Restaeasy 2.3.x.GA)またはapache-httpclient(2.2.x.GA)を使用してClientRequest



/ ClientResponse<T>



を使用できます。 使用例は次のとおりです。

 ClientRequest request = new ClientRequest(url); request.header("X-Additional-Header", "header value"); //     : GET, POST, PUT, DELETE ClientResponse<String> response = request.get(String.class); if(response.getCode() == 200) { String result = response.getEntity(); log.info(result); }
      
      







UPD:クライアントフレームワークを使用する場合、次のようにプログラムを起動するときに一度初期化する必要があります。

 RegisterBuiltin.register(ResteasyProviderFactory.getInstance());
      
      







このアプローチにより、任意のフィールド、任意のリクエストボディなどを設定できます。

次の記事では、この場合に発生する1つの問題について説明します。



UPD:引き続きこちらをご覧ください



All Articles