Web API URI和控制器命名&结构体

时间:2014-08-31 22:08:51

标签: rest asp.net-web-api

我正在编写我的第一个Web API应用程序,并对正确的URI命名以及如何构建控制器有一些疑问。这是一个电子商务应用。

对于订单,我想出了这个:

Resource                    GET               POST           PUT             DELETE
/api/orders/123             Get order header  Create order   Upd. order  Delete order
/api/orders/123/lines       List lines
/api/orders/123/lines/1     N/U               Create line    Upd. line   Delete line
/api/orders/123/payments    List payments
/api/orders/123/payments/1                    Create paymnt  N/U         Delete paymnt
/api/orders/123/rebates     List rebates

我的第一个问题是:上面是一个合理的命名/ URI方案吗?

我的第二个问题是如何最好地将上面的URI映射到正确的控制器操作。

订单(标题)是直截了当的:

Verb   Resource                  Controller         Action/method
GET    /api/orders/123           OrderController    Get(id)
POST   /api/orders/123           OrderController    Post(Order order)
PUT    /api/orders/123           OrderController    Put(Order order)
DELETE /api/orders/123           OrderController    Delete(id)    

但订单行怎么样 - 如何命名控制器方法?喜欢这个?

Verb   Resource                    Controller         Action/method
GET    /api/orders/123/lines       OrderController    GetLines(id)
POST   /api/orders/123/lines/1     OrderController    PostLine(OrderLine line)
PUT    /api/orders/123/lines/1     OrderController    PutLine(OrderLine line)
DELETE /api/orders/123/lines/1     OrderController    DeleteLine(id)    

付款的同样问题:

Verb   Resource                       Controller         Action/method
GET    /api/orders/123/payments       OrderController    GetPayments(id)
POST   /api/orders/123/payments/1     OrderController    PostPayment(OrderPayment payment)
PUT    /api/orders/123/payments/1     OrderController    PutPayment(OrderPayment payment)
DELETE /api/orders/123/payments/1     OrderController    DeletePayment(id)    

我正在寻找上述指导。一个实用的&简单的解决方案将是伟大的(即使它稍微弯曲RESTfulness)。换句话说,我已经看到关于什么是真正的RESTful和什么不是什么的辩论,但如果违反规则以结构良好,可行的方式完成工作并保持简单,那么我就没有问题。

1 个答案:

答案 0 :(得分:0)

结构实际上取决于您希望客户端如何使用API​​以及客户端所需的访问粒度。例如,如果您希望彼此独立地更新/读取付款和行,那么您的API是有意义的,但如果所有客户端都需要一起读取/修改它们,那么您可能会对层次结构略微过分您的路径(您可以只有表示单个订单的路径,而不是用于访问其组件的子路径)。

至于从路径到处理程序的映射,您几乎总是希望每个路径都有一个唯一的处理程序,但您可能会发现可以共享的各种处理程序之间存在许多共同的逻辑。

由于这是电子商务,因此您应该在设计中考虑的一个重要部分(这里不存在)是如何对这些不同的处理程序进行身份验证。哪些处理程序需要身份验证(如果是,则对不同的处理程序进行何种级别的身份验证)。