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

本文关键字:参数 获取 复杂 类型 uri WebApi | 更新日期: 2023-09-27 18:18:54

我正在开发一个WebApi rest建议解决方案,并希望传递多个复杂类型作为url参数。我需要传递两个对象的个人资料。个人数据包含FullName和Id。

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

我希望我可以调用我的REST服务与url类似:

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 ? FullName = NAME1& Id = 1

在这种情况下foo参数总是NULL/价值/GetByFoo/?foo = {" FullName":"1","Id":"1"}

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

/价值/GetByFooPair/?foopair = {" Foo1 ":{"FullName":"1","Id":"1"},"Foo2":{"FullName":"名字2","Id":"2"}}

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

但是它也不工作,控制器方法参数总是null

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

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

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

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

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

如果你想处理复杂的对象,你需要把它改成[HttpPost]

你可以这样做:

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

在。net框架4.5.2下测试WebAPI 2.2 (nuget package version 5.2.3) .

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