如何在RESTful服务中添加多个Get、Post和Delete方法

3

我是一名新手,希望了解如何添加多个Get / Post / Delete方法的REST服务。

例如, 我们有以下Get方法:-

GetAllUsers()
GetUserByID(int id)
GetUserByName(string name)

同样地,删除方法:-
DeleteAllUsers()
DeleteUserByID(int id)
DeleteUserByName(string name)

Post/Put方法:

PutCreateDefaultUser()
PutCreateUser(User user)
PutCreateMultipleUsers(User[] users)

在上述情况下如何定义Get/Delete/Post/Put方法。这些名称本身是否表明了它们是get/delete/put/post方法。
还有,如何为每个设置uri模板?
每种方法的URI将是什么?
注意:我正在使用MVC4 .Net Web API项目,我没有使用WCF。
2个回答

4
您的例子更多地指向了RPC实现方式。REST是基于资源的,每个资源都有自己的方法,包括获取(Get)、更新(Update)、插入(Insert)和删除(Delete)。如果您计划在ASP.NET API中实现您所说的内容,那么完全没有问题(但请注意,这不是REST)。
更新(2018年): 经过一段时间的经验积累(以及一个用户对这个旧回答的评论),我意识到说OP端点不是Restfull是错误的。路由可以很容易地完成,就像我的例子已经展示的那样。有趣的是,我们随着时间的推移学习并改变自己的想法/观点。 :) UserController
[RoutePrefix("api/v1")]
public class UserController : ApiController
{

    [HttpGet]
    [Route("users")]
    public HttpResponseMessage GetAllUsers()
    {
        ...
    }

    [HttpGet]
    [Route("users/{id:int}")]
    public HttpResponseMessage GetUserByID(int id)
    {
        ...
    }

    [HttpGet]
    [Route("users/{name:string}")]
    public HttpResponseMessage GetUserByName(string name)
    {
        ...
    }

    [HttpDelete]
    public HttpResponseMessage DeleteAllUsers()
    {
        ...
    }

    [HttpDelete]
    [Route("users/{id:int}")]
    public HttpResponseMessage DeleteUserByID(int id)
    {
        ...
    }
}

使用HttpAttributes,您可以拥有任意数量的HttpDeletes。只需将属性放在操作的顶部即可。它还强制方法只能使用该HTTP动词调用。因此,在上面的Delete中,如果您使用GET动词进行调用,将什么也不会得到。(操作将找不到)
如果您愿意,还可以明确地为您的操作提供自定义路由。例如,对GetUserByID的调用将是:
GET:http://localhost:2020/api/v1/users/1

这不是REST吗? - SeanMC
有没有一种RESTful的方式来实现这样的路由和结果呢? - SeanMC
我根据另一个答案弄清楚了。如果你在global.asax中更新routeconfig为类似api/{controller}/{id}的东西,那么你就完全不需要引用动作名,只需引用控制器即可。如果你直接向/users发送没有参数的GET请求,那么你将获得不带参数的方法的结果。如果你向/users/5发送带参数的GET请求,那么你将调用第二个users方法,即使它们具有相同的名称。 - SeanMC
1
没错。不过从你的第一个问题开始:我说OP的路由不符合REST风格是错误的。当我写这个答案时,REST大热,所以我想我被牵扯进去了。但是确定的是,他所有的端点(除了那个删除全部,我永远不会这样做...)对我来说看起来都像是完美的Rest。有趣的是,我们可以随着时间和经验改变我们的想法。是吗?很高兴你评论了,这样我就可以回来修改它了。 - jpgrassi

1
大部分你需要的信息可以在这里找到: 您可以使用属性指定HTTP方法:AcceptVerbs,HttpDelete,HttpGet,HttpHead,HttpOptions,HttpPatch,HttpPost,HttpPut。 否则,默认情况下,如果控制器方法的名称以“Get”、“Post”、“Put”、“Delete”、“Head”、“Options”或“Patch”开头,则该操作支持该HTTP方法。 如果以上都不是,则该方法支持POST。
URI将取决于控制器的名称: /api/controller-name/GetAllUsers

1
默认情况下,在Web API中并不使用操作名称。但是您可以通过修改路由模板为“api/{controller}/{action}/{id}”来更改此设置。 - Mike Wasson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接