【问题标题】:How to develop an ASP.NET Web API to accept a complex object as parameter?如何开发 ASP.NET Web API 以接受复杂对象作为参数?
【发布时间】:2012-09-04 20:07:45
【问题描述】:

我有以下 Web API (GET):

public class UsersController : ApiController
{
    public IEnumerable<Users> Get(string firstName, string LastName, DateTime birthDate)
    {
         // Code
    }
}

这是一个 GET,所以我可以这样称呼它:

http://localhost/api/users?firstName=john&LastName=smith&birthDate=1979/01/01

并接收用户的 xml 结果。

是否可以像这样将参数封装到一个类中:

public class MyApiParameters
{
    public string FirstName {get; set;}
    public string LastName {get; set;}
    public DateTime BirthDate {get; set;}
}

然后有:

    public IEnumerable<Users> Get(MyApiParameters parameters)

我已经尝试过了,每当我尝试从 http://localhost/api/users?firstName=john&amp;LastName=smith&amp;birthDate=1979/01/01 获取结果时,parameter 为空。

【问题讨论】:

    标签: asp.net-mvc-4 asp.net-web-api


    【解决方案1】:

    默认情况下,复杂类型是从正文中读取的,这就是你得到 null 的原因。

    将您的操作签名更改为

     public IEnumerable<Users> Get([FromUri]MyApiParameters parameters)
    

    如果您希望模型绑定器从查询字符串中提取模型。

    您可以在来自 MSFT 的 Mike Stall 的优秀文章 - http://blogs.msdn.com/b/jmstall/archive/2012/04/16/how-webapi-does-parameter-binding.aspx 中阅读有关 Web API 如何进行参数绑定的更多信息

    【讨论】:

    • 不错的收获。我知道我错过了什么! :)
    • 每次我回到 Web API 开发时,这似乎都让我感到厌烦。我希望 Swashbuckle 能做一些事情来确保它和 Web API 与他们关于这些数据是作为查询字符串数据还是正文数据来/去的假设保持同步。我希望 Web API 不会假设在 GET 调用中从 Body 中读取复杂类型——这毫无意义,尤其是默认情况下。感谢 Tohid 和@Filip - 这个问题救了我无数次!
    • 链接不再是最新的,但似乎默认的参数绑定方法期望将对象属性作为 URL 参数传递,此链接正在工作(目前):docs.microsoft.com/en-us/aspnet/web-api/overview/…跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-05
    • 2016-03-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-07
    • 2011-09-04
    相关资源
    最近更新 更多