Web API - 每个 HTTP 动词/参数组合只有 1 个操作?

Posted

技术标签:

【中文标题】Web API - 每个 HTTP 动词/参数组合只有 1 个操作?【英文标题】:Web API - Only 1 Action Per HTTP Verb/Parameter Combination? 【发布时间】:2014-01-19 02:08:53 【问题描述】:

我对 MVC 非常熟悉,但对 WebAPI 还是很陌生,我遇到了一个令人困惑的问题。

我有一个名为“DummyController”的控制器(继承自 ApiController),它有 5 个默认的 get、post、put 和 delete 脚手架方法(2 个用于 get),我在底部添加了我自己的方法名为“FindDummyObjects()”,我用 [HttpGet] 属性进行了修饰。

当我导航到“api/dummy”或“api/dummy/get”时,我会得到 2 个字符串对象(“value1”和“value2”)的默认结果。 但是,当我导航到“api/dummy/FindDummyObjects”时,它会抱怨“参数字典包含参数 'id' 的空条目”。

这意味着它根本没有指向我的动作(因为它是无参数的),所以它可能指向默认的“Get(int id)”动作。

当我注释掉除我自己之外的所有操作时,我会得到我期望的结果。

所以我的问题是,对于 WebAPI,每个带有特定参数集的 http 动词是否只能有 1 个动作,而不管动作的名称是否不同?

例如,我似乎不可能在单个控制器中执行 10 个不同的 http GET 操作,除非它们都有不同的参数并使用操作名称“Get”(除非我做了一些自定义路由,否则我假设)。

对吗?

代码: // 获取 api/dummy 公共 IEnumerable Get() 返回新字符串[] "value1", "value2" ;

    // GET api/dummy/5
    public string Get(int id)
    
        return "value";
    

    // POST api/dummy
    public void Post([FromBody]string value)
    
    

    // PUT api/dummy/5
    public void Put(int id, [FromBody]string value)
    
    

    // DELETE api/dummy/5
    public void Delete(int id)
    
    

    [HttpGet]
    public IEnumerable<Models.DummyObject> FindDummyObjects()
    
        IList<Models.DummyObject> myDummyList = new List<Models.DummyObject>();

        for (int i = 0; i < 10; i++)
        
            Models.DummyObject dumObj = new Models.DummyObject();
            dumObj.ObjectId = i;
            dumObj.ObjectName = string.Empty;

            myDummyList.Add(dumObj);
        

        return myDummyList;
    

【问题讨论】:

这听起来不像是正确的行为。如果动作的名称不同,那么它们是完全不同的路线,框架应该很容易确定哪个是哪个。你能展示实际的代码而不是仅仅描述它吗? 刚刚按要求添加了代码 为什么有FindDummyObjects 方法?您似乎不尊重 RESTful 约定。您需要的是DummiesController 上的IEnumerable&lt;Models.DummyObject&gt; Get() 方法。当您进行 RESTful 路由时,始终考虑资源。 @Darin Dimitrov 我现在只是在试验。我知道这就是我可以让它工作的方式,但我更感兴趣的是为什么我描述的实现不起作用工作。 它不起作用,因为开箱即用的 ASP.NET Web API 依赖于标准 RESTful 路由。它预计如果某些开发人员选择了这个框架,他可能希望使用 REST 作为约定。如果他想违反这些约定,那么他将需要采取艰难的方式并修改他的路由等......或者可能只是使用一些 RPC 框架,例如 WCF,其中没有资源并且 HTTP 动词不占主导地位。 【参考方案1】:

Web API 路由有很多漏洞(我很客气),你碰巧碰到了一个。这也是他们在 Web API2 中引入属性路由的原因之一。您可能想尝试一下,因为它更加灵活。

【讨论】:

以上是关于Web API - 每个 HTTP 动词/参数组合只有 1 个操作?的主要内容,如果未能解决你的问题,请参考以下文章

Web Api GET 动词 405 不允许

RESTful API 如何设计

通俗易懂的 RESTful API 设计规范

你这API设计的真”辣鸡“,简直没法看!

ASP.NET Web API - 不允许 PUT 和 DELETE 动词 - IIS 8

如何让 PUT 和 DELETE 动词与 IIS 上的 Web API 一起使用