4

我是 WebApi 的新手,我不太明白

我确实知道所有动词都集中在 Get、Put、Post 和 Delete 上。但是来自沉重的 DDD 和 MVC 背景,我需要一些指示。

我习惯于公开服务/资源/操作,无论您想调用什么来进行一些内部过滤。例如,对于 SalesOrder 服务,我可能有 GetTodaysOrders、GetUnapprovedOrders 等操作。对“SalesOrder 集”应用一些过滤的操作

所以,在 WebApi 和一般的休息中,我想,我不应该这样做吗?我应该公开整个 SalesOrder 集吗?

过滤可以使用 OData 完成,但这会将知道要过滤什么的责任转移到消费者身上,消费者必须知道要请求什么,例如,消费者必须知道任何域/业务规则。那部分对我来说似乎完全陌生。

你如何处理这类事情?这可以通过某种方式来处理吗,我并不是说以一种骇人听闻的方式,例如为您可以过滤某些数据的每一种方式创建一个新的 Web api 控制器。

4

3 回答 3

1

我感觉到你的痛苦。我第一次真正被迫改变我的思维方式是当我开始在 Ruby On Rails 上进行开发时。

关于一般的公开方法,请尝试按以下顺序进行:

  1. 首先公开资源的全套 CRUD 操作(也就是制作你的 RESTful 资源)
  2. 通过对那些用于身份验证/权限检查等方法的前钩子和后钩子返回并私有化不应该公开的东西。

然后,当您获得资源时,一般来说,一个好的经验法则是在之前显示必要的内容?并在之后隐藏复杂性?,从而使您的资源能够进行过滤,但不需要它。换句话说,用过滤来装饰你的方法。

因此,假设您想要一个/orders端点:

Base URL: /orders
REST params: /orders(:/id)
Additional params:
  - dateRange
  - purchaseStatus
  - price
  - etc
Example usage: 
  /orders?dateRange=1y&price=lt:100

当然,我之所以这么说,是因为我倾向于同意 APIGEE 在他们的 API 最佳实践白皮书中所说的。我想你会发现它很有帮助。

https://pages.apigee.com/rs/apigee/images/api-design-ebook-2012-03.pdf

于 2013-08-16T23:43:18.623 回答
1

这需要一些时间来适应,但您会发现 Kristian 引用的 APIGEE 方法非常有用。

我应该公开整个 SalesOrder 集吗?

只要你愿意。默认的 Index 方法只是为了帮助您开始,如果它对您的情况没有意义,请将其删除。或将其更改为以分页方式返回销售订单,或仅返回最近的销售订单。

在您的情况下 -

GetTodaysOrders 将是一个 GET 请求,如 api/orders?period=1

GetUnapprovedOrders 将是一个 GET 请求,例如 api/orders?approved=false

这两个调用都可能是相同的操作方法- ActionResult Index(int period, bool approved)(我现在不在开发机器上,不记得参数是否需要为空/可选)

至于 OData,它非常强大,但是 API 的使用者必须知道如何调用它,以及过滤什么。但无论如何,他们应该知道这一点。您可以使用 OData 设置可以提取多少记录的限制,您支持哪些 orderby(以保护对数据库中未索引列的搜索)以及更多示例,请参见此处

于 2013-08-18T05:47:32.727 回答
0

除了上述所有出色的答案之外:如果某个功能/方法确实需要任何 CRUD 操作都无法(轻松)支持的功能,则您始终可以求助于 OData 操作。

您可以手动将特定方法声明为操作,然后您实际上可以像以前那样从 MVC 中获取公开的方法。Mike Wasson 写了一篇关于 OData Actions 的完美文章,您可以在这里找到:Supporting OData Actions in ASP.NET Web API

于 2013-08-19T07:11:48.503 回答