/user/5?v=html
とが同じリソースの 2 つの表現を返す場合/user/5?v=json
、それらは同じ URL である必要があります (たとえば/user/5
、REST の原則に従って) 。
クライアント側ではAccept
、リクエストでヘッダーを使用して、サーバーが送信する表現を示すことができます。
Accept
サーバー側では、ヘッダーの値をテストするために Play 2.1 で次のように記述できます。
public static Result user(Long id) {
User user = User.find.byId(id);
if (user == null) {
return notFound();
}
if (request().accepts("text/html")) {
return ok(views.html.user(user));
} else if (request().accepts("application/json")) {
return ok(Json.toJson(user));
} else {
return badRequest();
}
}
ブラウザーはすべてのタイプに一致するリクエストのヘッダーを設定するため、テスト"text/html"
は常に他のコンテンツ タイプの前に記述する必要があることに注意してください。Accept
*/*
各アクションに を書きたくない場合はif (request().accepts(…))
、次のように因数分解できます。
public static Result user(Long id) {
User user = User.find.byId(id);
return representation(user, views.html.user.ref);
}
public static Result users() {
List<User> users = User.find.all();
return representation(users, views.html.users.ref);
}
private <T> Result representation(T resource, Template1<T, Html> html) {
if (resource == null) {
return notFound();
}
if (request().accepts("text/html")) {
return ok(html.apply(resource));
} else if (request().accepts("application/json")) {
return ok(Json.toJson(resource));
} else {
return badRequest();
}
}