【问题标题】:How to add multiple Get Post and Delete methods in RESTful Service如何在 RESTful 服务中添加多个 Get Post 和 Delete 方法
【发布时间】:2013-06-21 11:44:28
【问题描述】:

我是 REST 服务的新手,想知道如何添加多个 Get / Post / Delete 方法。

例如 我们有以下获取方法:-

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

同样,删除方法:-

DeleteAllUsers()
DeleteUserByID(int id)
DeleteUserByName(string name)

发布/放置方法:-

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

那么在上述情况下如何定义 Get/Delete/Post/Put 方法。它自己说的那个名字是get / delete / put / post吗

还有如何为每个设置uri模板?

每个方法的 URI 是什么?

注意:我使用的是 MVC4 .Net Web API 项目,我没有使用 WCF

【问题讨论】:

    标签: rest asp.net-mvc-4 asp.net-web-api


    【解决方案1】:

    你的例子更多地指向RPC implementation。 REST 基于资源。每个资源都有它的方法。获取、更新、插入和删除。如果你打算在你的问题中提到你所说的,你可以在你的 ASP.NET API 中毫无问题地做到这一点:(但请确保这是 NOT REST)

    更新(2018 年) 经过一段时间和经验(以及用户对这个旧答案的评论),我意识到说 OP 端点不是 Restfull 是错误的。正如我的示例已经显示的那样,可以轻松完成路线来实现这一目标。有趣的是,我们如何随着时间的推移学习和改变自己的想法/意见。 :)

    用户控制器

    [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,您可以拥有任意数量的 HttpDelete。只需将属性放在操作的顶部,您就可以开始了。它还强制只能使用该 HTTP 动词调用方法。因此,在上面的 Delete 中,如果您使用 GET 动词进行调用,您将一无所获。 (找不到动作)

    如果您愿意,您也可以明确地为您的操作提供自定义路线。例如,您对 GetUserByID 的调用是:

    获取:http://localhost:2020/api/v1/users/1

    【讨论】:

    • 这怎么不休息?
    • 难道没有一种 RESTful 方式来获得这样的路由和结果吗?
    • 我是根据另一个答案弄清楚的。如果您将 global.asax 中的 routeconfig 更新为类似 api/{controller}/{id} 的内容,那么您根本不会引用操作名称。只是控制器。如果您将不带参数的 GET 请求直接传递给 /users,那么您会从不带参数的方法中获得结果。如果您将带有参数的 GET 请求传递给 /users/5,那么您会点击第二个带有参数的用户方法,即使它们具有相同的名称
    • 没错。不过,从您的第一个问题来看:确实,说 OP 的路线不平静是我的错误。回到我写这个答案的时候,REST 大惊小怪,所以我想我已经赶上了它。但是可以肯定的是,他的所有端点(除了删除我永远不会做的所有端点..)对我来说看起来都很好。有趣的是,我们如何随着时间和经验改变主意。嗯?很高兴你发表评论,这样我就可以回来解决这个问题。
    【解决方案2】:

    您需要的大部分信息都可以在这里找到:

    您可以使用属性指定 HTTP 方法:AcceptVerbs、HttpDelete、HttpGet、HttpHead、HttpOptions、HttpPatch、HttpPost、HttpPut。 否则,如果控制器方法的名称以“Get”、“Post”、“Put”、“Delete”、“Head”、“Options”或“Patch”开头,则按照惯例,该操作支持该 HTTP 方法。 如果以上都不是,则该方法支持 POST。

    Uri 将取决于控制器的名称: /api/控制器名称/GetAllUsers

    【讨论】:

    • 默认情况下,在 Web API 中不使用操作名称。您可以通过将路由模板修改为“api/{controller}/{action}/{id}”来更改此设置
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-06
    • 1970-01-01
    • 2014-03-01
    • 1970-01-01
    • 2012-04-30
    • 2015-06-06
    • 1970-01-01
    相关资源
    最近更新 更多