JAX-RSで応答本文を設定する
1. 概要
JavaでのRESTWebサービスとそのクライアントの開発を簡素化するために、Jerseyと呼ばれる JAX-RSAPIの標準でポータブルな実装が設計されています。
Jerseyは、 JAX-RS APIのサポートを提供し、JAX-RSリファレンス実装として機能するRESTWebサービスを開発するためのオープンソースフレームワークです。
このチュートリアルでは、さまざまなメディアタイプでJerseyレスポンスボディを設定する方法を見ていきます。
2. Mavenの依存関係
まず、pom.xmlファイルに含まれている次の依存関係が必要です。
<dependency>
<groupId>org.glassfish.jersey.bundles</groupId>
<artifactId>jaxrs-ri</artifactId>
<version>2.26</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.core</groupId>
<artifactId>jersey-server</artifactId>
<version>2.26</version>
</dependency>
JAX-RSの最新バージョンはjaxrs-riにあり、Jerseyサーバーはjersey-serverにあります。
3. ジャージーでの対応
当然、 Jersey を使用して応答を作成する方法はいくつかありますが、以下でそれらを作成する方法を検討します。
ここでのすべての例はHTTPGETリクエストであり、curlコマンドを使用してリソースをテストします。
3.1. OKテキスト応答
ここに示されているエンドポイントは、プレーンテキストをJersey応答として返す方法の簡単な例です。
@GET
@Path("/ok")
public Response getOkResponse() {
String message = "This is a text response";
return Response
.status(Response.Status.OK)
.entity(message)
.build();
}
curlを使用してHTTPGETを実行し、応答を確認できます。
curl -XGET http://localhost:8080/jersey/response/ok
このエンドポイントは、次のように応答を返します。
This is a text response
メディアタイプが指定されていない場合、Jerseyはデフォルトでtext/plainになります。
3.2. エラー応答
エラーはJersey応答としてに返送することもできます。
@GET
@Path("/not_ok")
public Response getNOkTextResponse() {
String message = "There was an internal server error";
return Response
.status(Response.Status.INTERNAL_SERVER_ERROR)
.entity(message)
.build();
}
応答を確認するために、curlを使用してHTTPGETリクエストを実行できます。
curl -XGET http://localhost:8080/jersey/response/not_ok
エラーメッセージは、応答で返送されます。
There was an internal server error
3.3. プレーンテキストの応答
単純なプレーンテキスト応答を返すこともできます。
@GET
@Path("/text_plain")
public Response getTextResponseTypeDefined() {
String message = "This is a plain text response";
return Response
.status(Response.Status.OK)
.entity(message)
.type(MediaType.TEXT_PLAIN)
.build();
}
ここでも、 curlを使用してHTTPGETを実行し、応答を確認できます。
curl -XGET http://localhost:8080/jersey/response/text_plain
応答は次のようになります。
This is a plain text response
Responseでtype()メソッドを使用する代わりに、Producesアノテーションを使用しても同じ結果を得ることができます。
@GET
@Path("/text_plain_annotation")
@Produces({ MediaType.TEXT_PLAIN })
public Response getTextResponseTypeAnnotated() {
String message = "This is a plain text response via annotation";
return Response
.status(Response.Status.OK)
.entity(message)
.build();
}
curlを使用して応答検証を行うことができます。
curl -XGET http://localhost:8080/jersey/response/text_plain_annotation
応答は次のとおりです。
This is a plain text response via annotation
3.4. POJOを使用したJSON応答
単純なPlainOld Java Object(POJO)を使用して、Jersey応答を作成することもできます。
以下に示す非常に単純なPerson POJOがあり、これを使用して応答を作成します。
public class Person {
String name;
String address;
// standard constructor
// standard getters and setters
}
Person POJOを使用して、JSONを応答本文として返すことができるようになりました。
@GET
@Path("/pojo")
public Response getPojoResponse() {
Person person = new Person("Abhinayak", "Nepal");
return Response
.status(Response.Status.OK)
.entity(person)
.build();
}
このGETエンドポイントの動作は、次のcurlコマンドを使用して確認できます。
curl -XGET http://localhost:8080/jersey/response/pojo
Person POJOはJSONに変換され、応答として返送されます。
{"address":"Nepal","name":"Abhinayak"}
3.5. 単純な文字列を使用したJSON応答
事前にフォーマットされた文字列を使用して応答を作成でき、簡単に実行できます。
次のエンドポイントは、Stringとして表されるJSONをJersey応答でJSONとして送り返す方法の例です。
@GET
@Path("/json")
public Response getJsonResponse() {
String message = "{\"hello\": \"This is a JSON response\"}";
return Response
.status(Response.Status.OK)
.entity(message)
.type(MediaType.APPLICATION_JSON)
.build();
}
これは、 curlを使用してHTTPGETを実行し、応答を確認することで確認できます。
curl -XGET http://localhost:8080/jersey/response/json
このリソースを呼び出すと、JSONが返されます。
{"hello":"This is a JSON response"}
同じパターンがXMLやHTMLなどの他の一般的なメディアタイプにも適用されます。 MediaType.TEXT_XMLまたはMediaType.TEXT_HTMLを使用してXMLまたはHTMLであることをJerseyに通知するだけで、残りはJerseyが処理します。
4. 結論
この簡単な記事では、さまざまなメディアタイプのJersey(JAX-RS)応答を作成しました。
この記事で言及されているすべてのコードスニペットは、GitHubのにあります。