.net 如果我的web API不是';这不是简单的积垢吗?

.net 如果我的web API不是';这不是简单的积垢吗?,.net,asp.net-mvc,rest,asp.net-web-api,.net,Asp.net Mvc,Rest,Asp.net Web Api,我对RESTfulWebAPI最佳实践有一些疑问 标准似乎是使用HTTP协议,如GET、PUT和POST来简化接口 获取/票证-检索票证列表 GET/tickets/12-检索特定的票证 张贴/记录单-创建新记录单 PUT/tickets/12-更新tickets#12 修补程序/票证/12-部分更新票证#12 删除/票证/12-删除票证#12 但是,在花了一段时间开发我的第一个API之后,我真的觉得它不适合这样一个整洁的设计 My API支持添加或更新LineItems,调用方可以一次添加或更

我对RESTfulWebAPI最佳实践有一些疑问

标准似乎是使用HTTP协议,如
GET
PUT
POST
来简化接口

获取/票证-检索票证列表
GET/tickets/12-检索特定的票证
张贴/记录单-创建新记录单
PUT/tickets/12-更新tickets#12
修补程序/票证/12-部分更新票证#12
删除/票证/12-删除票证#12

但是,在花了一段时间开发我的第一个API之后,我真的觉得它不适合这样一个整洁的设计

My API支持添加或更新
LineItem
s,调用方可以一次添加或更新任意数量的
LineItem
s。此外,他们可以确认或取消任何号码。在添加和更新的情况下,还提供了大量额外的相关数据。对于确认或取消,需要的数据要少得多


那么,这如何适应上述票证界面呢?我正在创建一个糟糕的Web API吗?认可标准是否允许其他变更?有什么好的链接可以讨论这个问题吗?

在类上可以有方法,这些方法在整个对象上执行更具体的任务,而不仅仅是CRUD任务。因此,假设您的
Ticket
对象也有行项目,您可能有一个PUT调用URI,如:

PUT/tickets/12/LineItem?name=BLAH&address=FOO

在代码中,您的方法如下

public class TicketController
{
    [HttpPut]
    [ActionName("LineItem")]
    public HttpResponseMessage UpdateLineItem(int id, string name, string address)
    {
        // Do stuff here.
    }
}
很明显,你也在那里使用了其他方法。您可能希望修改它,以便行项目信息通过PUT或POST主体而不是通过URI输入,但是显示URI参数的工作方式也很有用


但是,如果所讨论的
行项目
s与
票证
s无关,然后你应该找到其他的控制器把它们放进去。

POST/ticket/12/行-在ticket 12下创建新行你现在应该知道请求链接是离题的了……你能解释一下为什么在这里使用
ActionName
属性而不是仅仅命名action
LineItem()
?谢谢,两种都可以。这取决于开发人员的偏好以及您的团队对编码/web api标准的遵守程度。只要每个人都理解PUT==Update,就可以了,没有理由把它放在方法名中。但即便如此,如果您使用Code Lens或其他工具查找LineItem方法,那么在进入类之前,您不会看到[HttpPut]装饰。更新只是让方法的功能更加清晰。不相关,您应该根据@benPearce的评论包含票证ID。我将修改我的答案以表明这一点。