【问题标题】:Controller methods to return different models控制器方法返回不同的模型
【发布时间】:2019-03-12 06:38:33
【问题描述】:

我正在创建一个 REST API,所以我正在创建一个控制器。

我有一个这样的实体:

public class User
{
    public int Id { get; set; }
    public string Username { get; set; }
    public string Password { get; set; }
    public int Age { get; set; }
    public string PersonalInformation { get; set; }
}

在我的前端,我有 2 个视图,需要两个不同的用户模型。

管理员可以查看用户的个人信息,他需要查看除密码之外的所有信息。

一个用户修改了他的所有信息,所以他需要查看他的所有信息。

另一种视图是只显示用户UsernamePersonalInformation 两者,管理员和用户都可以要求。

在这种情况下,我需要三个不同的模型发送到前端。

要访问这些信息,我的控制器将有一个方法:

[HttpGet("{id}")]
public IActionResult Get(int id)
{
    ....
}

此时我的问题来了,因为我有相同的方法来返回两个不同的模型(将来可能会更多)。调查Web API设计,我读到访问的关键字可能不是动词。一个方法 url 是 /users/1,但其他的必须不同,我的问题来了。

谢谢!

【问题讨论】:

  • 您正在描述三个不同的端点,每个端点都有不同的资源(您可以称它们为 DTO 或模型)。那你为什么不创建三个不同的路线呢? /users/current/users/{id} /personalinfo/{id}?
  • 根本不是一个好主意...然后管理员可以调用用户端点。这不安全......

标签: c# rest api web controller


【解决方案1】:

您可以创建两个不同的 dto(数据传输对象)。只有两个简单的类,比如你的用户,里面有你想要的数据。 我不知道您是如何进行授权的,但是当管理员调用 api 时,您返回 Ok(dto) 并且当用户调用 Ok(dtoWithPassword) 时。

并确保密码经过哈希处理和加盐处理。

【讨论】:

  • 但是想象一下我有另一个视图,我只需要查看用户 Uername 和 PersonalInformation 并且管理员和用户都可能会要求它。
  • 你必须做授权。例如基本身份验证很简单。用户或管理员将其用户名和密码与请求一起发送。然后你可以有一个自定义的授权属性,将 thread.currentprincipal 设置为用户。然后在该方法中,您可以检查用户是管理员还是普通用户。 youtube 上有很多视频可以了解这一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-09-22
  • 1970-01-01
  • 1970-01-01
  • 2017-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多