【问题标题】:Mvc Web API complex object query via GET通过 GET 的 Mvc Web API 复杂对象查询
【发布时间】:2012-12-19 05:59:39
【问题描述】:

有没有办法通过“GET”查询web api,但参数中包含复杂的对象?

到目前为止,我看到的所有示例似乎都表明我必须使用“POST”。但我不想使用“POST”,因为这是一个查询,同时我不想要一个有 16 个参数的函数,因为那会很脆。

public Product Get(int id, string name, DateTime createdBy, string stockNumber, ... ) 
    { 
          ...
    }

我想把上面的变成:

public Product Get(ProductQuery query) 
    { 
          ...
    }

有没有办法做到这一点?以及如何使 HttpClient 与上述服务一起工作。

【问题讨论】:

  • 不,您不能通过 GET 请求传递模型。常见的做法是将 id 传递给方法,然后从源中获取剩余的数据。

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


【解决方案1】:

您可以将ProductQuery 参数传递给[FromUri]

假设这是您的ProductQuery 课程:

public class ProductQuery
{
    public int Id { get; set; }
    public string Name { get; set; }
    public DateTime CreatedBy { get; set; }
    public string StockNumber { get; set; }
}

您可以使用 [FromUri]... 注释您的操作参数...

    public Product Get([FromUri] ProductQuery productQuery)
    {...}

...并具有ProductQuery 的属性(即IdName、...)可以从Uri 中的查询字符串传入:

http://.../api/products?Id=1&Name=Product1&CreatedBy=1/4/2013&StockNumber=ABC0001

【讨论】:

  • 听起来不错,我想我可以强制它使用模型绑定器。
【解决方案2】:

您可能想查看 Web API 中的 OData 支持 - 也许这会满足您的需求?取决于查询的实现有多复杂!

http://blogs.msdn.com/b/alexj/archive/2012/08/15/odata-support-in-asp-net-web-api.aspx

【讨论】:

  • 我同意理查德的观点。如果它是公共 api,您最终可能会遇到客户端可能不支持带有正文的 GET 请求的问题。在stackoverflow.com/questions/11091160/… 进行更多讨论。
  • POST 可以支持 OData 吗?不是那种安宁的——我猜。这很难,我需要在糟糕的做法和失去开箱即用的 OData 支持之间做出选择。
  • 我不确定您为什么不想使用 OData?如果你使用像AutoMapper 这样的库,你可以只公开你想要的模型的属性。您可以使用 OData 进行一些非常复杂的查询,所以我同意 @Richard 并使用 Odata。
猜你喜欢
  • 1970-01-01
  • 2016-06-12
  • 1970-01-01
  • 2013-06-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-25
  • 2016-09-05
相关资源
最近更新 更多