2013-06-21 41 views
9

問:微風和RESTful的WebAPI

什麼樣的價值,當我需要實現我自己的POST/PUT/GET每個實體端點的WebAPI不微風提供?

背景:

This似乎是一個服務器端的微風控制器的共同執行:

[BreezeController] 
public class TodosController : ApiController { 

    readonly EFContextProvider<TodosContext> _contextProvider = 
     new EFContextProvider<TodosContext>(); 

    // ~/breeze/todos/Metadata 
    [HttpGet] 
    public string Metadata() { 
     return _contextProvider.Metadata(); 
    } 

    // ~/breeze/todos/Todos 
    // ~/breeze/todos/Todos?$filter=IsArchived eq false&$orderby=CreatedAt 
    [HttpGet] 
    public IQueryable<TodoItem> Todos() { 
     return _contextProvider.Context.Todos; 
    } 

    // ~/breeze/todos/SaveChanges 
    [HttpPost] 
    public SaveResult SaveChanges(JObject saveBundle) { 
     return _contextProvider.SaveChanges(saveBundle); 
    } 

    // other miscellaneous actions of no interest to us here 
} 

我在建設RESTish API的中間就是那個,到了這一點,有像下面這樣的端點:

GET /api/todo/1 
PUT /api/todo 
POST /api/todo 

看來Breeze要求端點很簡單呃(好或壞) - 只是一堆GETS和一個SaveChanges POST端點。

這讓我想到Breeze使用單一的Web客戶端進行快速開發,這是一件輕而易舉的事情......但只要有匿名客戶端,就必須強制他們進入您創建的任何breeze接口約定在您的客戶端,其中似乎擊敗了RESTful API設計的目的。是這樣嗎?

回答

28

Breeze是客戶端JavaScript框架,首先是formost。如果你沒有在客戶端上使用微風,Breeze.WebApi的好處僅限於

  • 增強的OData查詢支持($選擇和$擴展的支持,擴展$排序依據)
  • 保存攔截點(beforeSaveEntity和beforeSaveEntities事件)
  • 保存結果的處理(更新實體按鍵,併發列)
  • 元數據提取和系列化

正如您所猜測,微風都有不同的披來自REST的關於CRUD操作的問題。

Breeze適用於希望在一次交易中爲C/U/D提供不同類型資源的客戶。這允許用戶以複雜的方式操作數據而不會觸碰服務器,然後在準備就緒時保存更改。例如,可以創建一個新的Order,將兩個OrderLineItem從一個Order移動到另一個,刪除第三個OrderLineItem,修改第四個數量,然後修改數量SaveChanges()。 Breeze甚至支持使用localStorage從服務器完全斷開連接。重新連接後,所有更改都可以保存。

REST被設計爲在one resource at a time上操作。必須立即對服務器執行每個C/U/D操作,以便響應代碼可以執行。它適用於具有簡單更新需求的應用程序,但不適用於數據輸入應用程序。儘管transactions can be supported in REST,它們充其量是麻煩的。

話雖如此,您的服務器端Breeze API不限於您在Todos示例中看到的內容。 Breeze支持Named Saves,它允許您爲不同的操作擁有不同的端點。您還可以使用Save Interception來確保您的保存包僅包含應該保存的類型。當然,沒有什麼能夠阻止你在你的服務器上公開這兩個API,並且它們都由相同的持久層提供。

如果你有他們之間作出選擇,你應該和你的用戶開始。真正的用戶(不是開發人員)不關心REST,他們關心應用程序可以做什麼。最終,REST爲您的應用程序提供了HTTP的所有語義,而Breeze爲它提供了關係數據庫或對象數據庫的所有語義。哪一個暴露給你的用戶應該取決於你需要支持的用例。

+0

晶瑩剔透的答案!謝謝! – Riscie

+0

寫得很好,完整的答案! – user1789573