为rest api建模用户资源的最佳方法

时间:2014-09-19 10:59:20

标签: rest google-app-engine google-cloud-datastore objectify

我正在创建一个REST服务,它提供标准操作,例如按用户获取用户,添加用户,删除用户,列出用户等。我正在为此项目使用Google Cloud Endpoints。

我当前的模型使用从User派生的名为DisplayableUser的类。 User包含密码等敏感信息,而DisplayableUser仅包含可安全传递给客户端的字段。每当我需要为用户提供JSON表示时,我只需将User转换为DisplayableUser,然后将其序列化并传递给客户端。

我的问题是,这是正确的方法吗?我在此之前试过的尝试失败的方法是:

引入一个名为Password的单独类。此类包含对User(现在不包含任何敏感数据)和实际哈希密码的引用。我正在使用objectify与数据存储BTW进行交互。

@Entity
public class Password
{
    @Id
    Long id;
    @Load
    Ref<User> user;
    String passwordHash;

    .....
}

我从数据存储中检索User后面临的问题,如何检索相应的Password实体?

2 个答案:

答案 0 :(得分:1)

解决方案1 ​​ 而不是使用referenceProperty,为什么不让密码成为用户的孩子?这样,一旦你有了你的用户,你可以轻松地检索密码,比如

  

p = Password.query(Password.ancestorKey == user_ID).fetch()

这有助于使您的查询保持一致。当您查询密码时用户将被锁定的事实不应该是一个问题(当然,取决于您的使用情况)。

解决方案2 另一种解决方案是使用&#34;哈希密码&#34;创建密码。和&#34; user_id&#34;作为参数。

解决方案3 我个人会转储可显示的用户并只使用用户。当您查询&#34; safe&#34;信息,只需使用projection query即可查看您想要的字段

答案 1 :(得分:1)

每当数据模型与数据传输(或显示)模型不匹配时,都需要创建单独的类。在简单的情况下,在客户端共享数据模型类可能很方便,但只要您开始通过扭曲来获取正确的数据,就可以更轻松地制作DTO。使用projectlombok.org摆脱样板,DTO变得超轻量级。