web-dev-qa-db-fra.com

Repos sur Play! cadre

Nous prévoyons un projet servant principalement du contenu à des applications mobiles, mais nous devons avoir un site Web.

Ma question est de savoir s'il est logique d'utiliser Jersey ou Restlet pour développer des API REST) pour nos applications mobiles, puis utiliser Play! Pour servir le site Web.

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

117
Gary

Selon la demande, une approche simple semblable à 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. D'abord le fichier de 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. Cela n'est nécessaire à mon humble avis que si vous souhaitez avoir des adresses URI "spéciales" pour certaines ressources. Comme déclarer une route à /users/feed/ pour toujours revenir 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 constater, j'ai uniquement 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:

<users>
  <user>
    <name>${user.name}</name>
    . . .
  </user>
</users>

user.json:

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

user.html:

<html>...</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é. À l'aide de 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 de manière native, mais vous pouvez facilement utiliser un type différent en suivant la documentation officielle ou en utilisant le type module de négociation de contenu .

Si vous utilisez Eclipse pour le développement, nous vous suggérons d’utiliser le plugin client REST qui vous permet de tester vos itinéraires et le type de contenu correspondant.

112
seb

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 de travail REST avec le jeu 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<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://stackoverflow.com/a/2342589/1415732
}
68
Alden

Utilisez Play! tout faire. Ecrire REST) services en lecture est très très facile.

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

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

Selon la manière dont vous souhaitez renvoyer le résultat (XML, JSON, etc.), vous pouvez utiliser plusieurs méthodes. Par exemple, l’utilisation de la méthode renderJSON permet de restituer très facilement les résultats. Si vous souhaitez rendre le rendu XML, vous pouvez le faire de la même manière que si vous créiez un document HTML dans votre vue.

Voici un bel exemple.

fichier de 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.name}</name>
   <dob>${user.dob}</dob>
   .... etc etc
</user>
26
Codemwnci

L'intégration à une implémentation JAX-RS est une alternative possible à l'utilisation du routage HTTP intégré de Play. Pour un exemple avec RESTEasy, voir le module RESTEasy Play! .

Cette approche est utile si vous êtes 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. Sinon, ce serait plus simple. simplement utiliser Play pour servir JSON ou XML en réponse à des requêtes HTTP.

5
Peter Hilton

vous devriez jeter un oeil à

http://www.lunatech-labs.com/open-source/resteasy-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 ...

4
opensas

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

Vous devez avoir des méthodes spécifiques pour la création à l'aide de json et xml POST. Décrites ici: https://groups.google.com/forum/#!topic/play-framework/huwtC3YZDl

2
tchristensen