我已经阅读了一些关于RESTful API设计和背后的概念非常清晰的有趣教程...但现在让我们通过Play将其实践。
假设我们想要实现一个提供与用户打交道功能的RESTful API。让我们从模型开始。这是Address
类:
case class Address(
id: Int,
street: String,
zip: String,
city: String,
country: String
)
这里是User
类:
case class User(
id: Int,
email: String,
firstName: String,
lastName: String,
addresses: Array[Int]
// addresses: Array[Address] would this option be better?
)
...最后是路由:
# Creates a new user
POST /users controllers.users.create
# Gets the user identified by the specified id
GET /users/:userId controllers.users.find(userId)
# Modifies the user identified by the specified id
PUT /users/:userId controllers.users.update(userId)
# Deletes the user identified by the specified id
DELETE /users/:userId controllers.users.delete(userId)
第一个问题是:如何通过电子邮件检索用户并保持我的API符合REST规则?以下方法行不通,因为它与“GET users /:userId”冲突:
# Gets the user identified by the specified email address
GET /users/:email controllers.users.findByEmail(email)
我心目中有两个选择,它们分别是:
GET /users controllers.users.list(Option[email])
或者
GET /users/:email/xxx controllers.users.findByEmail(email)
在这里,xxx
应该是一种 虚拟资源。对此有什么建议吗?
我的第二个问题也是最后一个问题:我应该如何管理用户地址?是获取一个 User
,将新的 Address
添加到 User.addresses
,然后使用 PUT 更新 User
吗?
PUT /users/:userId controllers.users.update(userId)
我应该像这样创建一个特定的控制器来管理用户地址吗?
POST /users/:userId/addresses/ controllers.addresses.create(userId)
个人而言,我更喜欢第二个选项...但也许还有更好的选择。
GET /users controllers.users.find(email: Option[String])
和GET /user/:userId controllers.users.get(userId)
。 - Rado Buransky