我需要将一个复杂对象列表传递给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?
答案 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,进行自定义过滤并返回已过滤的列表。