2017-03-06 57 views
0

我对RESTful Web API最佳实践有一些疑问。如果我的web API不是简单的CRUD,该怎么办?

看起来标准是使用HTTP协议,如GETPUTPOST来简化接口。

GET /票 - 获取门票的列表
GET /票/ 12 - 检索特定票
POST /票 - 创建一个新的票
PUT /票/ 12 - 更新票#12
PATCH /票/ 12 - 部分更新票#12
DELETE /票/ 12 - 删除票#12

但花费在开发我的第一个API后,我真的不觉得它属于我nto这样一个整洁的设计。

我的API支持添加或更新LineItem s,并且呼叫者可以一次添加或更新这些LineItem中的任意数量。另外,他们可以确认或取消任何号码。在添加和更新的情况下,还提供了许多其他相关数据。为了确认或取消,需要更少的数据。

那么这怎么符合上述的票据界面?我是否创建了糟糕的Web API?公认的标准是否允许其他变化?讨论这个问题的任何好的链接?

+0

POST /票/ 12 /线 - 。创造条件,票新行12 – benPearce

+0

你现在应该可能知道,要求链接是脱离主题... –

回答

1

您可以在一个类上执行比整个对象上的CRUD任务更具体的任务的方法。因此,假设您的Ticket对象也有行项目,你可能有一个认沽认购URI,如:?

PUT /票/ 12/LineItem的名称= BLAH &地址= FOO

在代码的方法将那么就像

public class TicketController 
{ 
    [HttpPut] 
    [ActionName("LineItem")] 
    public HttpResponseMessage UpdateLineItem(int id, string name, string address) 
    { 
     // Do stuff here. 
    } 
} 

很明显,你会把你的其他方法放在那里。您可能需要修改它,以便您的订单项信息通过PUT或POST主体而不是通过URI进入,但是显示URI参数的工作方式也很有用。

但是,如果LineItem S IN的问题相关Ticket S,那么你应该找一些其他的控制器,把他们在

+0

你能澄清为什么你在这里使用'ActionName'属性而不是仅仅命名行为'LineItem()'?谢谢。 –

+0

要么应该工作。这归结于开发人员的偏好,以及您的团队与编码/网络API标准的紧密关系。只要每个人都明白PUT == Update,你就没事了,没有理由把它放在方法名中。但即使如此,如果您使用Code Lens或其他工具来查找LineItem方法,那么在进入课程之前您不会看到[HttpPut]装饰。更新只是让这个方法更清楚一点。不相关的,你应该包含票据ID per @ benPearce的评论。我会修改我的答案来证明这一点。 – Necoras

相关问题