Java 尽情玩乐吧!框架

Java 尽情玩乐吧!框架,java,rest,jersey,restlet,playframework,Java,Rest,Jersey,Restlet,Playframework,我们正在计划一个主要为移动应用程序提供内容的项目,但需要有一个网站 我的问题是,使用Jersey或Restlet为我们的移动应用程序开发RESTAPI,然后使用Play是否有意义!为网站服务 还是仅仅使用Play更有意义呢!做这一切?如果是这样,如何做休息与发挥!框架 使用Play!做这一切。 在游戏中编写REST服务非常简单 首先,routes文件使编写符合REST方法的路由变得简单 然后,在控制器中为要创建的每个API方法编写操作 根据返回结果的方式(XML、JSON等),您可以使用几种方法

我们正在计划一个主要为移动应用程序提供内容的项目,但需要有一个网站

我的问题是,使用Jersey或Restlet为我们的移动应用程序开发RESTAPI,然后使用Play是否有意义!为网站服务

还是仅仅使用Play更有意义呢!做这一切?如果是这样,如何做休息与发挥!框架

使用Play!做这一切。 在游戏中编写REST服务非常简单

首先,routes文件使编写符合REST方法的路由变得简单

然后,在控制器中为要创建的每个API方法编写操作

根据返回结果的方式(XML、JSON等),您可以使用几种方法。例如,使用renderJSON方法,可以非常轻松地渲染结果。如果您想要呈现XML,那么您可以使用与在视图中构建HTML文档相同的方式来呈现XML

这里有一个简单的例子

路由文件

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文件

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

${user.name}
${user.dob}
.... 等等

与JAX-RS实现集成是使用Play内置HTTP路由的一种可能的替代方法。有关RESTEasy示例,请参见


如果您已经投资于JAX-RS,或者如果您需要JAX-RS提供的一些高级特性,例如内容协商,那么这种方法是有意义的。如果没有,那么直接使用Play来响应HTTP请求提供JSON或XML将更简单。

根据请求,这是一种类似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.html:

<html>...</html>
这将以JSON格式获取ID为1的用户的详细信息。Play目前本机支持HTML、JSON和XML,但您可以通过遵循或使用来轻松使用不同的类型


如果您使用Eclipse进行开发,我建议您使用,它可以让您测试路由及其相应的内容类型。

您应该看看


这是一个自动构建rest界面的play模块,就像crud模块自动构建管理区域一样…

play 1.2.3版似乎打破了这种方法。如果您下载了@seb完成的源代码并在前面提到过,那么使用POST和JSON对象创建新的用户对象就不再可能了


您需要使用特定的方法来创建json和xml文章。此处概述:

这仍然是一个受欢迎的问题,但投票率最高的答案与当前版本的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)
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
}
app/controllers/UserController.java:

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)
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
}
publicstaticresult getUsers()
{
List users=Database.getUsers();
返回ok(Json.toJson(users));
}
公共静态结果getUser(长id)
{
User=Database.getUser(id);
return user==null?notFound():ok(Json.toJson(user));
}
公共静态结果createUser()
{
User newUser=Json.fromJson(request().body().asJson(),User.class);
用户插入=Database.addUser(newUser);
创建的返回(Json.toJson(inserted));
}
公共静态结果更新程序(长id)
{
User User=Json.fromJson(request().body().asJson(),User.class);
用户更新=数据库.updateUser(id,用户);
返回ok(Json.toJson(updated));
}
公共静态结果deleteUser(长id)
{
Database.deleteUser(id);
返回noContent();//http://stackoverflow.com/a/2342589/1415732
}

是否可以根据Accept标头选择正确的getUser方法?确实如此,但并不完全可靠。如果play知道头是一个JSON请求,那么它将尝试呈现一个getuser.JSON文件。如果标题是xml,那么它将尝试getuser.xml。但是,对于user/user/{id}/type来说,更容易理解,更像REST。我认为在URI中显式指定表示类型更像REST。最好直接使用Accept头,不要更改URI,因为您希望看到的资源保持不变。上面的示例可以重写为只有一个getUser(Long id)方法,该方法的功能与其当前实现完全相同,但不是定义getUserJSON、getUserXML等。而是定义getUser.json和getUser.xml模板。虽然我将其重命名为user.json/user.xml-tooThanks,但这非常有用。谢谢你@你能把你的评论扩展成一个答案吗?我很想看一个你所描述的技巧的例子。这出戏!文档是我见过的解释事物基本结构的最好的文档之一,但有时缺乏详细的示例。在同一个例子中演示这两种方法真的很清楚。我正在尝试您的例子,我很好奇发布的JSON数据在哪里转换为用户类。例如,在createUser函数中,我发现newUser为null。@Gary:也许您使用了“user”而不是“newUser”?控制器的名称和表单参数必须匹配。我创建了一个简单的项目,展示了上述方法,包括Thank上所有用户的HTML/XML/JSON输出,我通过使用curl发送JSON字符串对其进行了测试,结果表明play framework似乎无法识别appl