Asp.net 通过GET进行Mvc Web API复杂对象查询

Asp.net 通过GET进行Mvc Web API复杂对象查询,asp.net,rest,asp.net-mvc-4,asp.net-web-api,Asp.net,Rest,Asp.net Mvc 4,Asp.net Web Api,有没有一种方法可以通过“GET”查询web api,但其参数中包含复杂对象 到目前为止,我看到的所有例子似乎都表明我必须使用“POST”。但是我不想使用“POST”,因为这是一个查询,同时我也不想使用一个有16个参数的函数,因为它太脆弱了 public Product Get(int id, string name, DateTime createdBy, string stockNumber, ... ) { ... } 我希望将上述内容转化为: pu

有没有一种方法可以通过“GET”查询web api,但其参数中包含复杂对象

到目前为止,我看到的所有例子似乎都表明我必须使用“POST”。但是我不想使用“POST”,因为这是一个查询,同时我也不想使用一个有16个参数的函数,因为它太脆弱了

public Product Get(int id, string name, DateTime createdBy, string stockNumber, ... ) 
    { 
          ...
    }
我希望将上述内容转化为:

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

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

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


您可以传递
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
(即
Id
Name
,…)的属性,可以从Uri中的查询字符串传入:

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

不,您不能通过GET请求传递模型。通常的做法是将id传递给方法,然后从源代码中获取剩余的数据。我同意Richard的观点。如果它是一个公共api,那么最终可能会出现客户机不支持带有主体的GET请求的问题。更多讨论请参见。POST能否支持OData?我想不是那种安静的人。这很难,我需要在糟糕的实践和失去开箱即用的OData支持之间做出选择。我不知道你为什么不想使用OData?如果使用类似的库,则只能公开所需模型的属性。你可以用OData做一些非常复杂的查询,所以我同意@Richard的观点,并选择OData。听起来不错,我想我可以强迫它使用model binder。