ОТДЫХ на Play! фреймворк - PullRequest
       50

ОТДЫХ на Play! фреймворк

117 голосов
/ 07 декабря 2010

Мы планируем проект, который в первую очередь будет предоставлять контент для мобильных приложений, но нам нужен веб-сайт.

У меня вопрос: имеет ли смысл использовать Jersey или Restlet для разработки REST API для наших мобильных приложений, а затем использовать Play! обслуживать сайт.

Или имеет смысл использовать Play! сделать все это? Если так, как сделать ОТДЫХ с Play! фреймворк?

Ответы [ 6 ]

112 голосов
/ 13 декабря 2010

По запросу простой REST-подобный подход. Он работает почти так же, как и решение Codemwncis, но использует заголовок Accept для согласования контента. Первый файл маршрутов:

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

Вы не указываете тип контента здесь. Это ИМХО необходимо, только если вы хотите иметь «специальные» URI для определенных ресурсов. Как объявление маршрута к /users/feed/, чтобы всегда возвращаться в Atom / RSS.

Контроллер приложения выглядит следующим образом:

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

Как видите, я только удалил метод getUserJSON и переименовал метод getUser. Для работы разных типов контента вам нужно создать несколько шаблонов. Один для каждого желаемого типа контента. Например:

user.xml:

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

user.json:

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

user.html:

<html>...</html>

Этот подход дает браузерам всегда представление HTML, поскольку все браузеры отправляют текстовый / html тип содержимого в своем заголовке Accept. Все остальные клиенты (возможно, некоторые запросы AJAX на основе JavaScript) могут определять свой собственный желаемый тип контента. Используя метод jQuerys ajax (), вы можете сделать следующее:

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

Который должен получить информацию о пользователе с идентификатором 1 в формате JSON. Play в настоящее время поддерживает HTML, JSON и XML, но вы можете легко использовать другой тип, следуя официальной документации или используя модуль согласования контента .

Если вы используете Eclipse для разработки, я предлагаю использовать клиентский плагин REST , который позволяет вам проверять ваши маршруты и соответствующий им тип контента.

68 голосов
/ 13 ноября 2013

Это все еще популярный вопрос, но ответы с наибольшим количеством голосов не соответствуют текущей версии игры.Вот рабочий пример REST с игрой 2.2.1:

conf / маршруты:

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
}
26 голосов
/ 07 декабря 2010

Используйте Play! сделать все это. Написание сервисов REST в Play очень просто.

Во-первых, файл маршрутов упрощает написание маршрутов, соответствующих подходу REST.

Затем вы пишете свои действия в контроллере для каждого метода API, который хотите создать.

В зависимости от того, как вы хотите вернуть результат (XML, JSON и т. Д.), Есть несколько методов, которые вы можете использовать. Например, используя метод renderJSON, можно очень легко отобразить результаты. Если вы хотите визуализировать XML, вы можете сделать это точно так же, как вы строите HTML-документ в своем представлении.

Вот хороший пример.

файл маршрутов

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

Файл заявки

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 file

<user>
   <name>${user.name}</name>
   <dob>${user.dob}</dob>
   .... etc etc
</user>
5 голосов
/ 10 декабря 2010

Интеграция с реализацией JAX-RS является возможным альтернативным подходом к использованию встроенной HTTP-маршрутизации Play. Для примера RESTEasy см. RESTEasy Play! модуль .

Этот подход имеет смысл, если вы уже инвестировали в JAX-RS или если вам нужны некоторые расширенные функции REST, которые предоставляет JAX-RS, например согласование контента. В противном случае было бы проще использовать Play напрямую для обслуживания JSON или XML в ответ на HTTP-запросы.

4 голосов
/ 17 февраля 2011

Вы должны взглянуть на

http://www.lunatech -labs.com / с открытым исходным кодом / Resteasy-падла-игра-модуль

это модуль для игры, который автоматически создает интерфейс отдыха, точно так же, как модуль crud автоматически создает область администратора ...

2 голосов
/ 22 ноября 2011

Похоже, что этот подход нарушен в версии Play 1.2.3. Если вы загрузите исходный код, созданный @seb и упомянутый ранее https://github.com/sebhoss/play-user-sample,, создание нового пользовательского объекта с использованием POST с объектом JSON больше невозможно.

Вы должны иметь определенные методы для создания, выполненные с использованием json и xml POST. Обрисовано здесь: https://groups.google.com/forum/#!topic/play-framework/huwtC3YZDlU

...