Spring POST json实体

时间:2017-01-13 20:04:33

标签: json spring rest api

我会尽量简单,因为我找不到有这个问题的教程,我认为它属于设计REST API的最佳实践。

我有两个实体 - 角色(身份证,姓名) - 用户(id,名称,角色等)

向某个控制器发出POST请求时,以json方式执行此操作的最佳方法是什么。

{
"id": 1,
"name": "Luis",
"rol":{
"id": 1,
"name":Administrator,
"users" : [
//I think this is for the bidirectional relationship so 
can I avoid this property as well??
]
},
"another" : bla bla bla
}

对于这种方法,我是否必须放置相关实体​​的所有属性?这意味着我必须使用这种结构创建一个json,或者可以省略属性,这里有一个问题从我的脑子里出来怎么知道这是一个实体,所以它可以创建一个Role对象,从而与User建立关系?

或者我必须这样张贴:

   {
    "id": 1,
    "name": "Luis",
    "role_id" : 1,
    "another" : bla bla bla
    }

因此,当控制器知道这一点时,首先它会通过使用找到一个角色,让我们说当前我使用一个服务层...然后将它附加到用户。

最佳方法是什么?

谢谢。

1 个答案:

答案 0 :(得分:0)

在我看来,这个问题特别有趣,因为它回顾了一个非常普遍的开发人员的陷阱,即理解设计和实现之间的界限。

首先,让我们指出一个非常重要的概念:您的API与业务对象分离。您的API可以由对Java或Spring一无所知的架构师设计,并且更少关注您的UserRole类。

在REST中,服务器和客户端交换资源表示,这意味着服务器可以自由地确定该资源的最有意义的表示。换句话说,无论您使用的是JSON,XML还是其他什么,您都不必在API中包含一些信息,因为它在您的支持对象中以某种形式存在。

API中公开的资源存在于另一个维度中。它们与Spring控制器无关。

因此,您的问题的答案是:发送对该操作有意义的信息。服务器知道其余部分。

我必须承认你的第二个问题“Spring如何知道这是一个实体,因此它可以创建一个Role对象,从而与用户建立关系?”听起来有点奇怪。 Spring Controllers将HTTP请求绑定到类方法。这些方法类似于以下

@RequestMapping(value = "/users", method = RequestMethod.POST)
public String createUser(@RequestBody UserModel user) {
    //...
}

因此,当您将POST发送到正确的URL时,请求将从AS发送到您的DispatcherServlet,最后发送到您的ControllercreateUser方法。有效负载(即JSON表示)现在被解组为相应于您的用户表示定义的UserModel类(例如,包括idnameroleId)。此时,您可以控制所有内容,因为您可以使用user来执行所需的所有操作。可能你会创建一个Role对象和一个User对象,实现两个类之间的依赖关系,调用你的DAO或者等等,等待持久层完成它的操作并返回你的{{1} HTTP客户端的状态(填充201 created标头,如果你想要RESTful)。