WebApi复杂类型uri /获取多个参数

时间:2015-10-23 11:32:29

标签: c# asp.net-web-api http-get asp.net-web-api-routing

我正在开发一个WebApi休息服务解决方案,并希望将多个复杂类型作为url参数传递。 我需要传递两个个人数据对象。个人数据包含FullName和Id。

public class Foo
{
    public string FullName { get; set; }
    public string Id { get; set; }
}

我当时希望我可以使用与此类似的网址来调用我的REST服务:

http://localhost:53088/values/GetByFoo/?foo1={"FullName":"Name 1","Id":"1"}&foo2={"FullName":"Name 2","Id":"2"}

所以我编写了ValuesController.cs,如下所示:

    [HttpGet]
    public List<Foo> GetByFoo2([FromUri] Foo foo1, [FromUri] Foo foo2)
    {
        List<Foo> foos = new List<Foo>();
        foos.Add(foo1);
        foos.Add(foo2);
        return foos;
    }

不幸的是[HttpGet]方法中的参数总是NULL

由于它不工作,我试图从一个参数开始,这是我迄今为止所取得的成就:

ValuesController.cs

    [HttpGet]
    public Foo GetByFoo([FromUri] Foo foo)
    {
        return foo;
    }

在这种情况下,我只能得到正确的值: ?/值/ GetByFoo全名= NAME1和ID = 1

在这种情况下,foo参数始终为NULL / values / GetByFoo /?foo = {&#34; FullName&#34;:&#34; Name 1&#34;,&#34; Id&#34;:&#34; 1&#34;}

然后我想到使用一个包含foo1和foo2属性的参数并发出此get请求:

/ values / GetByFooPair /?foopair = {&#34; Foo1&#34;:{&#34; FullName&#34;:&#34; Name 1&#34;,&#34; Id&#34;: &#34; 1&#34;},&#34; Foo2&#34;:{&#34; FullName&#34;:&#34;名称2&#34;,&#34; Id&#34;:&# 34; 2&#34;}}

public class FooPair
{
    public Foo Foo1 { get; set; }
    public Foo Foo2 { get; set; }
}

但它也不起作用,控制器方法参数始终为空。

另一方面,如果我使用HttpPost方法并使用jQuery发出ajax请求,参数是正确的并包含期望值。

    [HttpPost]
    public FooPair GetByFooPairPost([FromBody] FooPair foopair)
    {
        return foopair;
    }

是否可以通过url传递几个复杂的类型参数?

我错过了什么?我做错了什么?

2 个答案:

答案 0 :(得分:1)

如果要处理复杂对象,则需要将其更改为[HttpPost]。

答案 1 :(得分:1)

你可以这样做:

http://localhost:53088/values/GetByFoo?foo1.fullName=Fullname1&foo1.id=ID1&foo2.fullName=Fullname2&foo2.id=ID2

在.NET Framework 4.5.2中的WebAPI 2.2(nuget包版本5.2.3)上进行了测试。

然而,正如Shyju和codeMonkey所指出的那样,如果对象有任何复杂性,我不建议这样做。 HttpPost接受正文中的任何数量的内容,而查询字符串的长度是有限的。此外,在使用正文时,您将从Javascript自动序列化为正确的JSON格式,在此处比较,您必须自己进行序列化。