it-swarm.com.de

RUHIG beim Spielen! Rahmen

Wir planen ein Projekt, das hauptsächlich Inhalte für mobile Apps bereitstellt, benötigen jedoch eine Website.

Meine Frage ist, ob es sinnvoll ist, Jersey oder Restlet zu verwenden, um REST APIs für unsere mobilen Apps zu entwickeln, und dann Play! Zu verwenden, um die Website bereitzustellen.

Oder ist es sinnvoller, nur Play zu verwenden? alles machen? Wenn ja, wie mache ich REST mit dem Play! Framework?

117
Gary

Auf Wunsch ein einfacher REST-ähnlicher Ansatz. Es funktioniert fast genauso wie die Codemwncis-Lösung, verwendet jedoch den Accept-Header für die Inhaltsaushandlung. Zuerst die Routendatei:

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

Sie geben hier keinen Inhaltstyp an. Dies ist IMHO nur erforderlich, wenn Sie "spezielle" URIs für bestimmte Ressourcen haben möchten. Als würde man eine Route zu /users/feed/, um immer in Atom/RSS zurückzukehren.

Der Application Controller sieht folgendermaßen aus:

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

Wie Sie sehen, habe ich nur die Methode getUserJSON entfernt und die Methode getUser umbenannt. Damit verschiedene Inhaltstypen funktionieren, müssen Sie jetzt mehrere Vorlagen erstellen. Eine für jeden gewünschten Inhaltstyp. Beispielsweise:

user.xml:

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

user.json:

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

user.html:

<html>...</html>

Bei diesem Ansatz erhalten Browser immer die HTML-Ansicht, da alle Browser in ihrem Accept-Header einen Text-/HTML-Inhaltstyp senden. Alle anderen Clients (möglicherweise einige JavaScript-basierte AJAX) -Anforderungen) können ihren eigenen gewünschten Inhaltstyp definieren. Mit der Methode jQuerys ajax () können Sie Folgendes ausführen:

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

Welche sollten Sie die Details über Benutzer mit der ID 1 im JSON-Format erhalten. Play unterstützt derzeit nativ HTML, JSON und XML, Sie können jedoch problemlos einen anderen Typ verwenden, indem Sie entweder der offiziellen Dokumentation oder dem Modul zur Inhaltsverhandlung folgen.

Wenn Sie Eclipse für die Entwicklung verwenden, empfehle ich, das REST-Client-Plugin zu verwenden, mit dem Sie Ihre Routen und den entsprechenden Inhaltstyp testen können.

112
seb

Dies ist immer noch eine beliebte Frage, aber die Antworten mit den meisten Stimmen sind mit der aktuellen Version des Spiels nicht auf dem neuesten Stand. Hier ist ein funktionierendes REST Beispiel mit 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/controller/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

Verwenden Sie Play! alles zu tun. Das Schreiben von REST Diensten in Play ist sehr, sehr einfach.

Erstens macht es die Routendatei einfach, Routen zu schreiben, die dem REST Ansatz entsprechen.

Anschließend schreiben Sie Ihre Aktionen für jede API-Methode, die Sie erstellen möchten, in den Controller.

Abhängig davon, wie Sie das Ergebnis zurückgeben möchten (XML, JSON usw.), gibt es einige Methoden, die Sie verwenden können. Mit der renderJSON-Methode können die Ergebnisse beispielsweise sehr einfach gerendert werden. Wenn Sie XML rendern möchten, können Sie dies genauso tun, wie Sie ein HTML-Dokument in Ihrer Ansicht erstellen würden.

Hier ist ein schönes Beispiel.

routendatei

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

Anwendungsdatei

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

getUser.xml Datei

<user>
   <name>${user.name}</name>
   <dob>${user.dob}</dob>
   .... etc etc
</user>
26
Codemwnci

Die Integration in eine JAX-RS-Implementierung ist eine mögliche Alternative zum integrierten HTTP-Routing von Play. Ein RESTEasy-Beispiel finden Sie im Modul RESTEasy Play! .

Dieser Ansatz ist sinnvoll, wenn Sie bereits in JAX-RS investiert sind oder wenn Sie einige der erweiterten Funktionen REST benötigen, die JAX-RS bietet, z. B. die Inhaltsaushandlung. Wenn nicht, ist es einfacher, Play direkt zu verwenden, um JSON oder XML als Antwort auf HTTP-Anforderungen bereitzustellen.

5
Peter Hilton

sie sollten einen Blick darauf werfen

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

es ist ein Modul zum Spielen, das automatisch ein Rest-Interface erstellt, genau wie das Crud-Modul automatisch einen Admin-Bereich erstellt ...

4
opensas

Anscheinend ist dieser Ansatz in Play Version 1.2.3 fehlerhaft. Wenn Sie die von @seb erstellte und bereits erwähnte Quelle herunterladen https://github.com/sebhoss/play-user-sample , erstellen Sie ein neues Benutzerobjekt mit POST mit einem JSON-Objekt ist nicht mehr möglich.

Für die Erstellung mit json- und xml-POSTs sind bestimmte Methoden erforderlich. Hier beschrieben: https://groups.google.com/forum/#!topic/play-framework/huwtC3YZDl

2
tchristensen