繁体   English   中英

WebApi和OData

[英]WebApi and OData

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

我确实知道所有动词都集中在Get,Put,Post和Delete上。 但是由于DDD和MVC的背景很深,我需要一些指导。

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

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

可以使用OData进行过滤,但是这将知道要过滤的内容的责任移交给了消费者,消费者必须知道要提出的要求,例如,消费者必须知道任何域/业务规则。 这部分对我来说似乎完全陌生。

您如何处理这类事情? 可以以某种方式处理此问题吗?我并不是说要像为每种可以过滤某些数据的方式创建新的Web api控制器那样简单的方法。

我感到你很痛苦。 第一次真正被迫改变思维方式是当我开始在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

习惯需要一些时间,但是您会发现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设置限制,以限制可提取的记录数,支持的排序方式(以保护对数据库中未索引列的搜索),更多示例请参见此处

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM