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