3

我是新来的WebApi,我不太会得到它WebApi和OData

我知道所有的动词都集中在Get,Put,Post和Delete上。但是,从一个沉重的DDD和MVC背景来看,我需要一些指针。

我用来公开服务/资源/行动,无论你想调用它做一些内部过滤。 例如为SalesOrder服务可能我喜欢GetTodaysOrders,GetUnapprovedOrders等 操作适用一些过滤的“SalesOrder集”

所以,在的WebAPI和休息,一般我想,我不应该做这个业务? 我应该公开整个SalesOrder集?

并且可以用OData完成过滤,但是移动了知道什么过滤到消费者的责任,消费者必须知道要求什么,例如,消费者必须知道任何域/业务规则。 这部分对我来说似乎完全陌生。

你如何处理这类事情? 这可以以某种方式处理,而且我并不是指以一种奇怪的方式创建新的Web API控制器,以便您可以过滤一些数据。

回答

1

我感到你的痛苦。我第一次真的被迫改变思维方式的时候是我开始开发Ruby On Rails的时候。

关于一般暴露方法,尝试按以下顺序做:通过公开全套CRUD操作的资源

  1. 开始(也就是让你的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

+0

我刚刚发现了一个小时左右,我可以用MVC4 WebApi中的路由注释我的服务。例如[HttpGet(“/ api/orders/unapproved”)]然后映射到我的get方法之一...非常光滑:) –

+0

这是另一种方式来做到这一点。不错 – Kristian

+0

@RogerAlsing您可以发表一个关于注释路线的链接吗? – tom

1

这需要一点时间来适应,但你会发现由克里斯蒂安非常有用引用的APIGEE方法。

我应该公开整个SalesOrder集?

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

在您的方案 -

GetTodaysOrders会像API /订单的供货周期GET请求= 1

GetUnapprovedOrders会像API /订单GET请求批准=假

双方的?这些电话可能是相同的行动方法 - ActionResult Index(int period, bool approved)(我现在不在开发机器,不记得参数是否需要可以为空/可选)

至于OData,它是非常强大的,但是消费者呃API必须知道如何调用它,以及要过滤的内容。但他们应该无论如何知道。您可以使用OData设置限制条件,可以提取多少条记录,支持哪个orderby(以保护在数据库中搜索未索引的列),更多示例参见here

0

除了上面所有的优秀答案之外:如果某个功能/方法确实需要一些不能(很容易)被任何CRUD操作支持的功能,那么您总是可以回顾OData操作。

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