2013-06-21 38 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