Мне нужно передать список сложных объектов в 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}
Он добавит элемент в "FilterElements" -List, но этот элемент имеет только значения по умолчанию из конструктора (я использую [FromURI])...
Как передать список моих объектов в Webservice?
Поместив объект JSON в свой GET-параметр, вы неправильно используете метод GET. Согласно w3c, методы GET должны использоваться только для извлечения данных из веб-службы (см. W3schools.com)
Хотя это может быть вопросом стиля, существует еще одна практическая причина не помещать "полезную нагрузку" в параметр URL: URL-адрес имеет ограничения по длине. Размер списка, который вы передаете, может отличаться, и вы не знаете наверняка, если сериализованный список JSON будет всегда короче, чем максимальная длина URL-адреса (примерно 2000 символов, кстати)
Мое предложение состоит в том, что вы создаете метод GET и POST на вашем веб-сервисе. Вы передаете список FilterElement
службе, вызывая метод POST от вашего клиента следующим образом:
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
}
Затем вы сохраняете список в сеансе веб-сервисов (как показано здесь). (В этом примере используются примитивные типы, но сеанс также работает для сложных типов).
В методе GET вы читаете список из сеанса, выполняете личную фильтрацию и возвращаете отфильтрованный список.