Si /user/5?v=html
y /user/5?v=json
regreso dos representaciones de un mismo recurso, que debe ser la misma URL p.ej /user/5
, según el REST principles.
En el lado del cliente, puede usar el encabezado Accept
en sus solicitudes para indicar qué representación desea que le envíe el servidor.
En el lado del servidor, se puede escribir la siguiente con Play 2.1 para probar el valor de la cabecera 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();
}
}
Tenga en cuenta que la prueba contra "text/html"
siempre debe ser escrito antes de cualquier otro tipo de contenido ya que los navegadores establezca el encabezado Accept
de sus solicitudes en */*
que coincida con todos los tipos.
Si no desea escribir el if (request().accepts(…))
en cada acción, puede factorizarlo, p. como la siguiente:
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();
}
}
bien, creo que me gustaría esta más. Pero, ¿qué tal el enlace a objetos Java basados en formularios HTML o objetos JSON (a partir de solicitudes), también tendría que implementarlos con una instrucción if/else? ¿O servirá 'bindFromRequest' para ambos? – adis
'bindFromRequest' utiliza la cadena de consulta y el cuerpo de la solicitud (que puede ser JSON, forma de url codificada, etc.). –