RESTful en jeu! cadre

Nous planifions un projet servant principalement le contenu aux applications mobiles, mais nous avons besoin d’un site Web.

Ma question est de savoir s’il est judicieux d’utiliser Jersey ou Restlet pour développer des API REST pour nos applications mobiles, puis d’utiliser Play! pour servir le site web.

Ou est-il plus logique d’utiliser simplement Play! tout faire? Si oui, comment faire REST avec Play! cadre?

    Selon la demande, une approche simple de type REST. Cela fonctionne presque de la même manière que la solution de Codemwncis mais utilise l’en-tête Accept pour la négociation de contenu. Tout d’abord le fichier des routes:

    GET /user/{id} Application.user POST /user/ Application.createUser PUT /user/{id} Application.updateUser DELETE /user/{id} Application.deleteUser 

    Vous ne spécifiez aucun type de contenu ici. À mon humble avis, cela n’est nécessaire que lorsque vous souhaitez disposer d’URI “spéciaux” pour certaines ressources. Comme déclarer une route à /users/feed/ pour toujours retourner dans Atom / RSS.

    Le contrôleur d’application ressemble à ceci:

     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); } 

    Comme vous pouvez le voir, j’ai seulement supprimé la méthode getUserJSON et renommé la méthode getUser. Pour que différents types de contenu fonctionnent, vous devez maintenant créer plusieurs modèles. Un pour chaque type de contenu souhaité. Par exemple:

    user.xml:

       ${user.name} . . .   

    user.json:

     { "name": "${user.name}", "id": "${user.id}", . . . } 

    user.html:

     ... 

    Cette approche donne toujours aux navigateurs la vue HTML, car tous les navigateurs envoient un type de contenu text / html dans leur en-tête Accept. Tous les autres clients (éventuellement des requêtes AJAX basées sur JavaScript) peuvent définir leur propre type de contenu souhaité. En utilisant la méthode jQuerys ajax (), vous pouvez effectuer les opérations suivantes:

     $.ajax({ url: @{Application.user(1)}, dataType: json, success: function(data) { . . . } }); 

    Ce qui devrait vous donner les détails sur l’utilisateur avec l’ID 1 au format JSON. Play prend actuellement en charge HTML, JSON et XML, mais vous pouvez facilement utiliser un type différent en suivant la documentation officielle ou en utilisant le module de négociation de contenu .

    Si vous utilisez Eclipse pour le développement, je suggère d’utiliser le plug-in client REST qui vous permet de tester vos itinéraires et le type de contenu correspondant.

    C’est toujours une question populaire, mais les réponses les plus votées ne sont pas à jour avec la version actuelle du jeu. Voici un exemple REST de travail avec play 2.2.1:

    conf / routes:

     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 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://stackoverflow.com/a/2342589/1415732 } 

    Utilisez le jeu! pour tout faire Ecrire des services REST dans Play est très très facile.

    Tout d’abord, le fichier de routes facilite l’écriture de routes conformes à l’approche REST.

    Ensuite, vous écrivez vos actions, dans le contrôleur, pour chaque méthode API que vous souhaitez créer.

    Selon la manière dont vous souhaitez renvoyer le résultat (XML, JSON, etc.), vous pouvez utiliser quelques méthodes. Par exemple, en utilisant la méthode renderJSON, les résultats peuvent être rendus très facilement. Si vous voulez rendre le XML, vous pouvez le faire de la même manière que vous construiriez un document HTML dans votre View.

    Voici un bel exemple.

    fichier des routes

     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 

    Dossier de candidature

     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); } 

    Fichier getUser.xml

      ${user.name} ${user.dob} .... etc etc  

    L’intégration avec une implémentation JAX-RS est une autre approche possible de l’utilisation du routage HTTP intégré à Play. Pour un exemple de RESTEasy, consultez le jeu RESTEasy Play! module .

    Cette approche est logique si vous avez déjà investi dans JAX-RS ou si vous avez besoin de certaines des fonctionnalités avancées REST fournies par JAX-RS, telles que la négociation de contenu. Dans le cas contraire, il serait plus simple d’utiliser Play directement pour diffuser JSON ou XML en réponse à des requêtes HTTP.

    vous devriez regarder

    http://www.lunatech-labs.com/open-source/restasy-crud-play-module

    c’est un module de jeu qui construit automatiquement une interface de repos, tout comme le module crud construit automatiquement une zone d’administration …

    Il semble que cette approche soit cassée dans Play version 1.2.3. Si vous téléchargez la source effectuée par @seb et mentionnée précédemment https://github.com/sebhoss/play-user-sample , la création d’un nouvel object utilisateur à l’aide de POST avec un object JSON n’est plus possible.

    Vous devez avoir des méthodes spécifiques pour la création en utilisant des POST json et xml. Décrit ici: https://groups.google.com/forum/#!topic/play-framework/huwtC3YZDlU