REST GET 端点根据用户角色返回不同的模型

Seb*_*Seb 10 rest api-design restful-architecture

我目前正在处理一些基于权限返回不同类型模型的端点:

例如,我们的业务对象正在转换为类型为Model或的对象AdvancedModel

public class Model
{
  public int Property1 {get; set;}
}

public class AdvancedModel : Model
{
  public int Property2 {get; set;}
}

public IActionResult Get()
{    
   (...)
   return User.IsAdmin 
      ? Mapper.Map<AdvancedModel>(Client);
      : Mapper.Map<Model>(Client);
}
Run Code Online (Sandbox Code Playgroud)

最初,这是为了每个人都可以检索客户的基本详细信息(姓名...),但只有管理员才能访问“敏感”信息(首选付款信息、帐单联系人)。

这使得我们的 API 更难理解,因为我们需要根据权限级别确定返回哪些字段......这很有效,但我担心随着我们的扩展(新角色、端点)它会变得时髦。

我们已经考虑引入新的端点,但它会在我们已经打包的 API 中添加一堆端点。

/api/v1/admin/clients/1234
vs
/api/v1/clients/1234
Run Code Online (Sandbox Code Playgroud)

我只是想知道处理这种情况的最佳做法是什么?

谢谢

Eve*_*ert 7

我发现 REST api 根据谁访问资源返回不同的内容可能会变得令人困惑。当您接受更改时,这会变得更加复杂PUT

我不认为这是一个一般性建议,因为不同的情况可能需要不同的解决方案,但在您的具体情况下,我认为拥有不同的资源更有意义。

在 API 中用多个点表示“一段数据”是可以的,但是,您可以做的另一件事是考虑以下内容:

/clients/1234 <- could contain all the data
                 everyone may see.

/clients/1234/billing <- contains only the
                         billing information
                         admins can see.
Run Code Online (Sandbox Code Playgroud)

我认为这也很好地体现了避免继承并使用组合的好处这一想法。你不需要 aModel和 an AdvancedModel。你需要两者Model和一个Billing模型。