ASP Web Api 2 GET中的复杂参数

时间:2014-08-31 08:53:13

标签: c# get asp.net-web-api2

我需要将一个复杂对象列表传递给GET-Request,我可以过滤结果。

复杂的对象看起来像这样:

public class RecordFilter
{
    public int PageNumber {get;set;}
    public int MaxRecordsPerPage {get;set;}
    public List<FilterElement> FilterElements {get;set;}
}

public FilterElement
{
    public string Name {get;set;}
    public object Value {get;set;}
    public bool IgnoreCase {get;set;}
}

现在我想将此作为参数传递给GET-Request,如下所示:

api/test/records?PageNumber=1&MaxRecordsPerPage=10&FilterElements=%7B%22Name%22%3A%22test%22%2C%20%22Value%22%3A%22x%22%2C%20%22IgnoreCase%22%3A%20true%7D

解码如下:

api/test/records?PageNumber=1&MaxRecordsPerPage=10&FilterElements={"Name":"test", "Value":"x", "IgnoreCase": true}

它会在&#34; FilterElements&#34; -List中添加一个元素,但是这个元素只有构造函数的默认值(我使用[FromURI])...

如何将我的对象列表传递给Webservice?

1 个答案:

答案 0 :(得分:0)

通过在GET参数中放置JSON对象,您滥用了GET方法。根据w3c,GET方法只应用于从Web服务(See w3schools.com)

中检索数据

虽然这可能是一种风格问题,但还有另一个更实际的原因就是不要使用有效载荷&#34;在URL参数中: 该URL具有长度限制。您传递的列表大小可能会有所不同,您不确定JSON序列化列表是否总是短于URL的最大长度(roughly 2000 characters by the way

我的建议是在Web服务上构建一个GET POST方法。您可以通过从客户端调用POST方法将FilterElement列表传递给服务,如下所示:

using (var wb = new WebClient())
{        
    string url = "api/test/records"; //the URL to your web service
    var response = wb.UploadValues(url, "POST", FilterElements); //FilterElements being a list of objects you want to pass
}

然后将列表存储在Web服务会话中(如图here所示)。 (在此示例中,使用了基本类型,但Session也适用于复杂类型)。

在GET方法中,您read the list from the session,进行自定义过滤并返回已过滤的列表。