2015-10-23 2 views
2

Я разрабатываю решение для пересмотра решения WebApi и хотел бы передать несколько сложных типов в качестве параметров URL. Мне нужно передать два объекта личных данных. Личные данные содержат FullName и Id.WebApi сложный тип uri/получить несколько параметров

public class Foo 
{ 
    public string FullName { get; set; } 
    public string Id { get; set; } 
} 

Я ожидал, что я мог бы назвать свою службу REST с URL, подобной следующим:

http://localhost:53088/values/GetByFoo/?foo1={"FullName":"Name 1","Id":"1"}&foo2={"FullName":"Name 2","Id":"2"} 

Так я кодированный ValuesController.cs, как это:

[HttpGet] 
    public List<Foo> GetByFoo2([FromUri] Foo foo1, [FromUri] Foo foo2) 
    { 
     List<Foo> foos = new List<Foo>(); 
     foos.Add(foo1); 
     foos.Add(foo2); 
     return foos; 
    } 

К сожалению, параметры в методах [HttpGet] всегда есть NULL

Поскольку он не работал, я попытался начать с одного часа госу и это то, что я достиг до сих пор:

ValuesController.cs

[HttpGet] 
    public Foo GetByFoo([FromUri] Foo foo) 
    { 
     return foo; 
    } 

Я мог только получить правильные значения в этом случае: /Значения/GetByFoo FullName = NAME1 & Id = 1

В этом параметре случае Foo всегда NULL /значения/GetByFoo/Foo = { "FullName": "Название 1", "Id": "1"}?

Тогда я думал использовать один параметр , содержащий как foo1, так и foo2 properti и получите запрос:

/values ​​/ GetByFooPair /? foopair = {"Foo1": {"FullName": "Name 1", "Id": "1"}, "Foo2": {"FullName ":" Имя 2" , "Id": "2"}}

public class FooPair 
{ 
    public Foo Foo1 { get; set; } 
    public Foo Foo2 { get; set; } 
} 

Но это не работает, либо, параметр метода контроллера всегда нуль.

С другой стороны, если я использую метод HttpPost и делаю запрос ajax с использованием jQuery, параметры верны и содержат ожидаемые значения.

[HttpPost] 
    public FooPair GetByFooPairPost([FromBody] FooPair foopair) 
    { 
     return foopair; 
    } 

Возможно ли передать несколько сложных типов параметров по URL-адресу?

Что мне не хватает? Что я делаю не так?

+0

Вы должны использовать [HttpPost]. Нет ничего плохого в этом. Помните, что Querystrings имеет предел – Shyju

ответ

0

Вам необходимо изменить его на [HttpPost], если вы хотите обрабатывать сложные объекты.

0

Вы можете сделать это следующим образом:

http://localhost:53088/values/GetByFoo?foo1.fullName=Fullname1&foo1.id=ID1&foo2.fullName=Fullname2&foo2.id=ID2 

Проверено на WebAPI 2,2 (NuGet версия пакета 5.2.3) в рамках .NET 4.5.2.

Однако, как указывали Shyju и codeMonkey, я бы не рекомендовал это, если объекты имеют какую-то сложность. HttpPost принимает любое количество контента в теле, тогда как длина запроса зависит. Также вы получите автоматическую сериализацию в правильный формат JSON из Javascript при использовании тела, так как в данном случае вам придется выполнять сериализацию самостоятельно.

Смежные вопросы