我正在开发一个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传递几个复杂的类型参数?
我错过了什么?我做错了什么?
答案 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格式,在此处比较,您必须自己进行序列化。