【问题标题】:Is it good practice for a Web API to do more than CRUD operations?Web API 可以做更多的 CRUD 操作吗?
【发布时间】:2022-01-12 02:25:16
【问题描述】:

我有一个客户端(Blazor 服务器)应用程序,它使用 Web API 从 SQL 数据库获取数据。我的数据库包含一个“客户”表。我的 Web API 包含 CRUD(创建、读取、更新、删除)端点,如下所示:

(创建客户)HTTP POST → "/api/customers"
(阅读客户)HTTP GET → "/api/customers/{id}"
(更新客户)HTTP PUT → "/api/customers"
(删除客户)HTTP DELETE → "/api/customers/{id}"

但我想知道添加这样的端点(除了 CRUD)是否也是一种好习惯?

(检查客户名称是否存在)HTTP GET → "/api/customers/name-exist/{name}"
(获取客户数量)HTTP GET → "/api/customers/count/"

【问题讨论】:

  • 如果您需要从您的 API 公开一些信息 - 您需要公开它)
  • 拥有无意义的路线不是一个好习惯。创建好的动作名称并将它们添加到路由中。一些控制器可以有数百个动作
  • @Serge 你说的没有意义是什么意思?检查名称是否存在或检查客户数量对我的应用程序很重要。您能否扩展您的回答,也许给我一个好的动作名称的例子?我对此很陌生,并正在努力学习。谢谢。
  • @JPGarza 我的意思是当我读到你的路线时,我不知道它在做什么。其中哪个添加新的,删除等等

标签: .net asp.net-web-api blazor webapi minimal-apis


【解决方案1】:

简短的回答是,满足应用程序的业务需求是一种很好的做法。如果您需要公开该信息,那就是您需要做的。

但是你给出的这两个例子不在 CRUD 模型之外。它们都是R阅读(或GETting)信息。这是完全正常的。没有不可接受的理由。

documentation for HTTP GET 说:

GET 方法意味着检索由 Request-URI 标识的任何信息(以实体的形式)。

这正是你在你给出的这两个例子中所做的。

【讨论】:

  • 好的,像这样的端点怎么样:(获取所有关系数据的客户/它的孩子)HTTP GET → "/api/customers/fully/{id}" 这将是一个单一的端点它返回客户的信息并(例如)返回该客户的订单,即使客户和订单是同一数据库下的不同模式/表。是否可以使用端点从同一数据库下的多个模式/表中返回数据?
  • @JPGarza 如果您需要这样做来满足您的业务需求,那为什么不呢?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-10
相关资源
最近更新 更多