我正在编写我的第一个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和什么不是什么的辩论,但如果违反规则以结构良好,可行的方式完成工作并保持简单,那么我就没有问题。
答案 0 :(得分:0)
结构实际上取决于您希望客户端如何使用API以及客户端所需的访问粒度。例如,如果您希望彼此独立地更新/读取付款和行,那么您的API是有意义的,但如果所有客户端都需要一起读取/修改它们,那么您可能会对层次结构略微过分您的路径(您可以只有表示单个订单的路径,而不是用于访问其组件的子路径)。
至于从路径到处理程序的映射,您几乎总是希望每个路径都有一个唯一的处理程序,但您可能会发现可以共享的各种处理程序之间存在许多共同的逻辑。
由于这是电子商务,因此您应该在设计中考虑的一个重要部分(这里不存在)是如何对这些不同的处理程序进行身份验证。哪些处理程序需要身份验证(如果是,则对不同的处理程序进行何种级别的身份验证)。