Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 带有管理视图的RESTAPI设计_C#_Rest_.net Core_Api Design - Fatal编程技术网

C# 带有管理视图的RESTAPI设计

C# 带有管理视图的RESTAPI设计,c#,rest,.net-core,api-design,C#,Rest,.net Core,Api Design,我有一个带端点的API应用程序: /api/v1/accounts /api/v1/accounts/id API具有用户和管理员角色的授权。用户可以将帐户标记为可见或隐藏。如果帐户是隐藏的,那么它在search/api/v1/accounts中不可见,但希望允许在用户模式下搜索隐藏的管理员,在管理员模式下搜索隐藏的也可见。用户可以看到他们的帐户,即使它被标记为隐藏 实现这一目标的最佳方式是什么?添加一个参数来检测它是对每个端点进行管理还是创建分离的端点?例如/api/v1/账户和/admin

我有一个带端点的API应用程序:

/api/v1/accounts
/api/v1/accounts/id
API具有用户和管理员角色的授权。用户可以将帐户标记为可见或隐藏。如果帐户是隐藏的,那么它在search/api/v1/accounts中不可见,但希望允许在用户模式下搜索隐藏的管理员,在管理员模式下搜索隐藏的也可见。用户可以看到他们的帐户,即使它被标记为隐藏


实现这一目标的最佳方式是什么?添加一个参数来检测它是对每个端点进行管理还是创建分离的端点?例如/api/v1/账户和/admin/api/v1/账户。如果我使用的是中介模式,那么应该对管理单一原则职责进行单独的查询/命令,还是将其保留在其中?我正在从我的问题中寻找最佳的解决方案,这是一个非常固执己见的问题,所以没有一个答案是完整的,也没有一点是正确的。我之所以写这篇文章,是因为信息太多,无法纳入评论部分,我想我可以为您提供一些好的指导方针,以便为您做出最佳决策

我也会表达我自己的观点,所以你也应该记住这一点

话虽如此,首先我看到您使用的是.NETCore和C,这两种语言概括了您的一种选择。因为至少ASP.NET MVC 3,我们可以选择使用我认为会给你想要的行为的区域,使用.NET的方式说话。您可以阅读.NET Core中的相关领域,以下是一段简短的引文:

在以下情况下,考虑在项目中使用区域:

该应用程序由多个可以逻辑分离的高级功能组件组成。 您希望对应用程序进行分区,以便每个功能区域都可以独立工作。 因此,优点是:

您可以以/admin/accounts/…的形式获得开箱即用的路由。。。 将来,如果您需要添加额外的管理功能,您可以轻松地将它们分开,这将使您的代码更干净,更易于维护 然而,我个人并不太喜欢这种方法。首先,我觉得这有点做作。通常情况下,您最终会得到95%的重复代码和一些小的调整,最后,您需要维护的额外代码是否值得从这种额外分离中获得好处,这是非常值得怀疑的

也许这些领域毕竟是可行的选择,但前提是你有相当多的功能可以封装在里面,从而获得一些真正的好处

结论:你有能力,如果你决定求助于/admin/accounts/。。。我建议你考虑使用面积,但我个人不会去那里。< /P> 第二种选择 您可能不会使项目复杂化太多,只需提供一些额外的路线来处理您的特定需求。我将概述其中的几个问题:

这种例外情况经常成为常态。现在,您需要为管理员提供一些额外的功能,一段时间后,您将需要为管理员提供一些功能。。 您的资源标识符将变得非常不一致,即使它不是非常专业,我认为在您的应用程序中有这样的路由有点难看。 事件虽然您没有义务使您的服务RESTful,但如果您遵循REST应用的一些约束,这将有所帮助

首先,请求应该是无状态的:

从客户端到服务器的每个请求都必须包含所有信息 理解请求所必需的

换句话说,您在问题中描述的所有逻辑,请求应该包含服务器返回正确响应所需的数据。从更实际的角度讲,我指的是像JWT这样的东西,您可以通过声明来传递有关用户的附加信息,以便服务器能够获取正确的数据

第二,统一接口:

REST由四个接口约束定义:标识 资源;通过陈述操纵资源; 自我描述信息;而且,超媒体是网络的引擎 应用程序状态

在您的情况下,我认为这是获取所需资源的最重要的资源约束标识—您实际上不需要管理部分,它是应用程序业务逻辑的一部分,您可以看到服务器获取正确数据所需的内容和所有信息应该在请求中,而不是URI中

结论:我认为您应该使用一些额外的数据来扩展您的请求,以便让服务器执行业务逻辑并保持路由现在的状态

然而 正如你所看到的,像领域这样的东西是存在的,微软的人比我和你都要好得多,所以这里没有黑/白的答案


希望至少我能给你一些思考的东西。

我会选择管理员端点…@Leron_说,Monica累了,但一周后没有答案,所以我删除了那里的帖子并在这里发布。