在网页API,你怎么过载时得到一个方法包含空值类型作为参数(In Web API, how do y

2019-09-19 07:02发布

UPDATE

我最初的假设是,可选参数是问题的原因。 这似乎是不正确的。 相反,它似乎是与多个操作方法的问题时,这些方法之一包含空值类型(如int?)对一些参数。

我使用Visual Studio 2012 RC和我刚开始接触网络API。 我碰到的一个问题,并得到错误“没有行动上的控制器‘酒吧’与请求匹配找到”。

我有一个酒吧控制器。 它有一个get()方法,它接受可选参数。

public IEnumerable<string> Get(string h, string w = "defaultWorld", int? z=null)
{
    if (z != 0)
        return new string[] { h, w, "this is z: " + z.ToString() };
    else
       return new string[] { h, w };
}

所以,我测试它与以下网址

  • / API /棒ΔH=你好
  • / API /条?H =你好&W =世界
  • / API /条?H =你好&W =世界&Z = 15

它适用于所有三种。

然后,我去添加另一个get()方法,此时用一个ID参数

 public string Get(int id)
 {
     return "value";
 }

我再次测试的URL。 这一次/ API /条?H =你好&W =世界和API /酒吧?H =你好失败。 该错误信息是“没有行动控制器‘酒吧’与请求匹配上找到。”

出于某种原因,这两种方法没有很好地一起玩。 如果我删除Get(int id)它的工作原理。 如果我改变INT? Z到字符串Z,那么它的工作原理(,但随后需要将我的操作方法里面的对象!)。

为什么网页API这样做呢? 这是一个错误或设计?

非常感谢。

Answer 1:

问题解决了,但是,它留下一个额外的问题。 这个问题似乎是重载的操作方法具有与该可选参数的问题。

因此,新的问题是,为什么这样,但我会离开,截至下级家伙比我;)

但是,这是一个好消息。 我不喜欢你报告的问题,并打算在复合型路线,而很高兴知道,简直是杰里钻机修复,并会反映的东西是如何在Web API的使用非常糟糕。 因此,好消息是,如果你有这个问题,这是通过简单地脱离了可选的PARAMS解决,做良好的醇”重载路线。 好消息,因为这绝不是一个杰里钻机修复,只会让你变得宽松一点的可选参数方便:

public class BarsController : ApiController
{
    public string Get(int id)
    {
        return "value";
    }

    public IEnumerable<string> Get(string h)
    {
        return Get(h, null, null);
    }

    public IEnumerable<string> Get(string h, string w)
    {
        return Get(h, w, null);
    }

    public IEnumerable<string> Get(string h, string w, int? z) 
    {
        if (z != 0)
            return new string[] { h, w, "this is z: " + z.ToString() };
        else
            return new string[] { h, w };
    }
}

干杯



Answer 2:

我还没有发现针对此问题的真正答案,但(这是什么原因API这样做),但我有一种变通方法,它允许一个重载的get()。 诀窍是包装在一个对象中的参数值。

public class Foo
{
    public string H { get; set; }
    public string W { get; set; }
    public int? Z { get; set; }
}

而到了酒吧控制器修改,以

public IEnumerable<string> Get([FromUri] Foo foo)
{
    if (foo.Z.HasValue)
        return new string[] { foo.H, foo.W, "this is z: " + foo.Z.ToString() };
    else
        return new string[] { foo.H, foo.W, "z does not have a value" };
}

[FromUri]是必要的,因为的WebAPI不,在默认情况下,使用URI参数,以形成“复杂”的对象。 总的想法是,复杂的对象是从哪里来<form>行动,而不是GET请求。

我仍然会继续检查,为什么网页API的行为这种方式,如果这其实是一个错误或预期的行为。



Answer 3:

您可以在路由添加动作参数超载WEB API控制方法。

 routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{action}/{id}",
            defaults: new {action = "Get", id = RouteParameter.Optional }
        );

一旦你在你的路线这种变化,那么你可以打电话给你的方法,如

/api/bars/get?id=1
/api/bars/get?h=hello&w=world&z=15

希望这有助于。

奥马尔



文章来源: In Web API, how do you overload Get when one method contains with nullable value types as parameters