2013-08-08 3 views
4

Я изучаю ASP.NET Web API, но где-то в объяснении о сложных типах, исходящем из тела запроса автор путает меня:ASP.NET ограничение Web API значения тела

PROFESSIONAL ASP.NET MVC 4: Глава 11 - ASP .NET Web API

«[..] сложные типы (все остальное), взяты из тела Существует дополнительное ограничение, а также:. только одно значение может исходить от тело, и это значение должен представлять собой полноту тела. [...] "

Brad Wilson

Что его среднее значение с этим «одно значение может исходить от тела»? Форматировщики API могут анализировать только один объект от тела? Не могли бы вы проиллюстрировать это на примере?

+0

Возможно, автор означает, что тело musu должно быть в точном соответствии с ожидаемым входом контроллера. Просто необходимые данные и ничего больше. –

ответ

4

только одно значение может прийти от тела

Предположим, у вас есть тело запроса, как это.

{"Id":12345, "FirstName":"John", "LastName":"West"}

Вы хотите, чтобы это JSON, чтобы быть связан с параметром типа, как это.

public class Employee 
{ 
    public int Id { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
} 

Метод действия может быть как void Post(Employee emp). И это не может быть так - void Post(Employee john, Employee duplicateJohn). Из тела может быть только одно значение.

, и это значение должно представлять полноту тела

Предположим, у вас есть такое же тело запроса, как это.

{"Id":12345, "FirstName":"John", "LastName":"West"}

И у вас есть два DTOs, как это.

public class Identifier 
{ 
    public int Id { get; set; } 
} 

public class Name 
{ 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
} 

Вы не можете иметь метод действия, как void Post(Identifier id, Name name) и ожидать, что тело будет связано частично с обоих параметров. Тело в целом должно быть связано только с значение. Таким образом, имея класс как

public class Employee 
{ 
    public int Id { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
} 

и связывание тела запроса в полном объеме к одному значению, как void Post(Employee emp) разрешено только.

+0

Спасибо! Я вздрогнул до Брэда, и он сказал, что ты роняешь! Гораздо понятнее! – Fals

1

Это означает, что вы не можете иметь многочастное тело, которое описывает более одного сложного типа. Скажем, если у вас есть тип User, весь корпус должен описать, что тип User, а не User + ShoppingChart.

Действительно тела для User типа:

{ 
    "id" : "1", 
    "username" : "someuser" 
} 

Invalid тела для User типа:

{ 
    "user" : { 
     "id" : "1", 
     "username" : "someuser" 
    }, 

    "shoppingCart" : { 
     "cartId" : "1", 
     "items" : "5" 
    } 
} 

Конечно, вы можете создать новый сложный тип, как UserAndShoppingCart (который использует пользовательские и торговые телеги классов как свойства), и теперь недопустимое тело будет действительным и десериализуемым для этого нового типа.

+0

I Twitted to Brad, и он сказал, что вы рок! У меня есть другой, только потому, что он поставил гораздо больше страха в awsear! В любом случае, благодарю Вас! – Fals