java - framework - RESTful en Play! marco de referencia
play framework (6)
Estamos planificando un proyecto que principalmente sirve contenido para aplicaciones móviles, pero que necesita tener un sitio web.
Mi pregunta es si tiene sentido usar Jersey o Restlet para desarrollar API REST para nuestras aplicaciones móviles, ¡y luego usar Play! para servir el sitio web.
¿O tiene más sentido simplemente usar Play! para hacerlo todo? Si es así, ¡cómo hacer REST con Play! ¿marco de referencia?
Esta sigue siendo una pregunta popular, pero las respuestas más votadas no están actualizadas con la versión actual del juego. Aquí hay un ejemplo REST funcional con play 2.2.1:
conf / rutas:
GET /users controllers.UserController.getUsers
GET /users/:id controllers.UserController.getUser(id: Long)
POST /users controllers.UserController.createUser
PUT /users/:id controllers.UserController.updateUser(id: Long)
DELETE /users/:id controllers.UserController.deleteUser(id: Long)
app / controllers / UserController.java:
public static Result getUsers()
{
List<User> users = Database.getUsers();
return ok(Json.toJson(users));
}
public static Result getUser(Long id)
{
User user = Database.getUser(id);
return user == null ? notFound() : ok(Json.toJson(user));
}
public static Result createUser()
{
User newUser = Json.fromJson(request().body().asJson(), User.class);
User inserted = Database.addUser(newUser);
return created(Json.toJson(inserted));
}
public static Result updateUser(Long id)
{
User user = Json.fromJson(request().body().asJson(), User.class);
User updated = Database.updateUser(id, user);
return ok(Json.toJson(updated));
}
public static Result deleteUser(Long id)
{
Database.deleteUser(id);
return noContent(); // http://.com/a/2342589/1415732
}
La integración con una implementación JAX-RS es un posible enfoque alternativo para usar el enrutamiento HTTP integrado de Play. Para un ejemplo RESTEasy, vea el juego RESTEasy! módulo .
Este enfoque tiene sentido si ya ha invertido en JAX-RS, o si necesita algunas de las características avanzadas de REST que JAX-RS ofrece, como la negociación de contenido. De lo contrario, sería más sencillo usar Play directamente para servir JSON o XML en respuesta a solicitudes HTTP.
Parece que este enfoque está roto en Play versión 1.2.3. Si descarga la fuente hecha por @seb y mencionó anteriormente github.com/sebhoss/play-user-sample , la creación de un nuevo objeto de usuario utilizando POST con un objeto JSON ya no es posible.
Necesita tener métodos específicos para la creación realizada utilizando POSS json y xml. Aquí se describe: https://groups.google.com/forum/#!topic/play-framework/huwtC3YZDlU
Según solicitud, un enfoque simple similar al REST. Funciona casi de la misma manera que la solución de Codemwncis, pero utiliza el encabezado Aceptar para la negociación de contenido. Primero el archivo de rutas:
GET /user/{id} Application.user
POST /user/ Application.createUser
PUT /user/{id} Application.updateUser
DELETE /user/{id} Application.deleteUser
No especifica ningún tipo de contenido aquí. Hacerlo es en mi humilde opinión solo necesario cuando quieres tener URIs "especiales" para ciertos recursos. Como declarar una ruta a /users/feed/
para regresar siempre en Atom / RSS.
El controlador de la aplicación se ve así:
public static void createUser(User newUser) {
newUser.save();
user(newUser.id);
}
public static void updateUser(Long id, User user) {
User dbUser = User.findById(id);
dbUser.updateDetails(user); // some model logic you would write to do a safe merge
dbUser.save();
user(id);
}
public static void deleteUser(Long id) {
User.findById(id).delete();
renderText("success");
}
public static void user(Long id) {
User user = User.findById(id)
render(user);
}
Como puede ver, solo eliminé el método getUserJSON y renombré el método getUser. Para que funcionen diferentes tipos de contenido, ahora debe crear varias plantillas. Uno para cada tipo de contenido deseado. Por ejemplo:
user.xml:
<users>
<user>
<name>${user.name}</name>
. . .
</user>
</users>
usuario.json:
{
"name": "${user.name}",
"id": "${user.id}",
. . .
}
user.html:
<html>...</html>
Este enfoque les da a los navegadores siempre la vista de HTML, ya que todos los navegadores envían un tipo de contenido de texto / html en su encabezado Accept. Todos los demás clientes (posiblemente algunas solicitudes AJAX basadas en JavaScript) pueden definir su propio tipo de contenido deseado. Usando el método jQuerys ajax () podrías hacer lo siguiente:
$.ajax({
url: @{Application.user(1)},
dataType: json,
success: function(data) {
. . .
}
});
Que debe obtener los detalles sobre el usuario con la ID 1 en formato JSON. Play actualmente admite HTML, JSON y XML de forma nativa, pero puede usar fácilmente un tipo diferente ya sea siguiendo la documentación oficial o utilizando el módulo de negociación de contenido .
Si está utilizando Eclipse para el desarrollo, le sugiero usar el complemento de cliente REST, que le permite probar sus rutas y su tipo de contenido correspondiente.
Utiliza Play! para hacerlo todo. Escribir servicios REST en Play es muy fácil.
En primer lugar, el archivo de rutas hace que sea fácil escribir rutas que se ajusten al enfoque REST.
Luego, escriba sus acciones, en el controlador, para cada método API que quiera crear.
Dependiendo de cómo quiera devolver el resultado (XML, JSON, etc.), existen algunos métodos que puede usar. Por ejemplo, al usar el método renderJSON, permite que los resultados se procesen muy fácilmente. Si desea procesar XML, puede hacerlo de la misma forma que crearía un documento HTML en su Vista.
Aquí hay un buen ejemplo.
archivo de rutas
GET /user/{id} Application.getUser(format:''xml'')
GET /user/{id}/json Application.getUserJSON
POST /user/ Application.createUser
PUT /user/{id} Application.updateUser
DELETE /user/{id} Application.deleteUser
Archivo de solicitud
public static void createUser(User newUser) {
newUser.save();
renderText("success");
}
public static void updateUser(Long id, User user) {
User dbUser = User.findById(id);
dbUser.updateDetails(user); // some model logic you would write to do a safe merge
dbUser.save();
renderText("success");
}
public static void deleteUser(Long id) {
// first check authority
User.findById(id).delete();
renderText("success");
}
public static void getUser(Long id) {
User user = User.findById(id)
renderJSON(user);
}
public static void getUserJSON(Long id) {
User user = User.findById(id)
renderJSON(user);
}
archivo getUser.xml
<user>
<name>${user.name}</name>
<dob>${user.dob}</dob>
.... etc etc
</user>
deberías echar un vistazo a
http://www.lunatech-labs.com/open-source/resteasy-crud-play-module
es un módulo para jugar que construye automáticamente una interfaz de descanso, al igual que el módulo crud construye automáticamente un área de administración ...