Rest WebApi与OData

Rest WebApi与OData,rest,asp.net-mvc-4,asp.net-web-api,domain-driven-design,odata,Rest,Asp.net Mvc 4,Asp.net Web Api,Domain Driven Design,Odata,我是WebApi新手,不太了解它 我知道所有的动词都集中在get、Put、Post和Delete上。 但是我有着丰富的DDD和MVC背景,我需要一些指导 我习惯于公开服务/资源/操作,不管你怎么称呼它,它会进行一些内部过滤。 e、 g.对于SalesOrder服务,我可能会有诸如GetTodaysOrders、GetUnapprovedOrders等操作。 对“SalesOrder集合”应用某些筛选的操作 所以,在WebApi和rest中,我想,我不应该这样做? 我应该公开整个销售订单集 可以使

我是WebApi新手,不太了解它

我知道所有的动词都集中在get、Put、Post和Delete上。 但是我有着丰富的DDD和MVC背景,我需要一些指导

我习惯于公开服务/资源/操作,不管你怎么称呼它,它会进行一些内部过滤。 e、 g.对于SalesOrder服务,我可能会有诸如GetTodaysOrders、GetUnapprovedOrders等操作。 对“SalesOrder集合”应用某些筛选的操作

所以,在WebApi和rest中,我想,我不应该这样做? 我应该公开整个销售订单集

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

你是如何处理这类事情的?
这可以用某种方式来处理吗?我不是说用一种像创建一个新的web api控制器这样的老套方式来过滤数据。

我感觉到了你的痛苦。我第一次真正被迫改变我的思维方式是在我开始在RubyonRails上开发时

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

  • 首先公开资源的全套CRUD操作(也称为生成RESTful资源)
  • 返回并私有化那些不应该被公开的东西,通过在这些方法上做预钩子和后钩子来进行身份验证/权限检查等等
  • 然后,当您拥有资源时,一个通常很好的经验法则是在
    之前显示必要的内容,并隐藏
    后面的复杂性,从而使您的资源能够进行过滤,但不需要它。换句话说,用过滤来装饰你的方法

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

    Base URL: /orders
    REST params: /orders(:/id)
    Additional params:
      - dateRange
      - purchaseStatus
      - price
      - etc
    Example usage: 
      /orders?dateRange=1y&price=lt:100
    
    当然,我之所以这么说,是因为我倾向于同意APIGEE在其API最佳实践白皮书中所说的。我想你会发现这很有帮助


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

    我应该公开整个销售订单集

    只要你愿意。默认索引方法只是帮助您开始使用,如果在您的情况下没有意义,请删除它。或者将其更改为以分页方式返回销售订单,或者仅返回最新的销售订单

    在您的场景中-

    GetTodaysOrders将是一个像api/orders?period=1一样的GET请求

    GetUnapprovedOrders将是类似api/orders的GET请求?approved=false

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


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

    除了上面的所有重要答案之外:如果有某个函数/方法确实需要某些无法(轻松)实现的功能要得到任何CRUD操作的支持,您总是可以依靠OData操作


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

    我在一个小时左右前发现,我可以用MVC4 WebApi中的路由为我的服务添加注释。e、 g[HttpGet(“/api/orders/unapproved”)],然后映射到我的一个get方法。。。相当圆滑:)那是另一种方法。nice@RogerAlsing你可以发布一个关于注释路由的链接吗?@tom你需要最新版本的Asp.Net WebApi一旦你有了它,你可以用HttpGet(“路径”)HttpPost(“路径”)注释你的端点etc@RogerAlsing那一个说的是遗留软件包。也许这个-?