Se /user/5?v=html
e /user/5?v=json
ritorno due rappresentazioni della stessa risorsa, dovrebbero essere lo stesso URL, per esempio /user/5
, in base allo REST principles.
Sul lato client, è possibile utilizzare l'intestazione Accept
nelle richieste per indicare quale rappresentazione si desidera che il server invii.
Sul lato server, è possibile scrivere il seguente con Play 2.1 per testare il valore dell'intestazione Accept
:
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();
}
}
Nota che il test contro "text/html"
deve sempre essere scritto prima di qualsiasi altro tipo di contenuto perché i browser imposta l'intestazione Accept
delle loro richieste allo */*
che corrisponde a tutti i tipi.
Se non si desidera scrivere lo if (request().accepts(…))
in ogni azione, è possibile scomporlo, ad es. come la seguente:
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();
}
}
fonte
2012-05-21 13:04:56
ok, penso che mi piacerebbe questo più. Ma per quanto riguarda il binding agli oggetti Java basati su HTML Form o JSON Object (dalle richieste), dovrei anche implementarli con un'istruzione if/else? Oppure 'bindFromRequest' servirà entrambi? – adis
'bindFromRequest' utilizza la stringa di query e il corpo della richiesta (che può essere JSON, modulo url codificato, ecc.). –