Почему мы должны указывать FromBody и FromUri?

Почему FromBody и FromUri атрибуты, необходимые в ASP.NET Web API`?

В чем разница между использованием атрибутов и их отсутствием?

107 голосов | спросил Rajneesh 8 J000000Tuesday14 2014, 10:45:29

4 ответа


0

Когда ASP.NET Web API вызывает метод на контроллере, он должен установить значения для параметров, процесс называется привязка параметров .

По умолчанию Web API использует следующие правила для привязки параметров:

  • Если параметр имеет «простой» тип , Web API пытается получить значение из URI . К простым типам относятся типы примитивов .NET (int, bool, double и т. Д.), А также TimeSpan, DateTime, Guid, decimal и string, а также любой тип с преобразователем типов, который может преобразовывать строки.

  • Для сложных типов Web API пытается прочитать значение из тела сообщения , используя средство форматирования медиа-типа.

Итак, если вы хотите переопределить вышеуказанное поведение по умолчанию и заставить Web API считывать сложный тип из URI, добавьте [FromUri] атрибут для параметра. Чтобы заставить Web API считывать простой тип из тела запроса, добавьте атрибут [FromBody] к параметру.

Итак, чтобы ответить на ваш вопрос, нужны [FromBody] и [FromUri] в Web API просто переопределяют, если необходимо, поведение по умолчанию, как описано выше. Обратите внимание, что вы можете использовать оба атрибута для метода контроллера, но только для других параметров, как показано .

Существует много еще информация в Интернете, если вы используете Google" привязка параметров веб-API ".

ответил djikay 8 J000000Tuesday14 2014, 14:07:52
0

Поведение по умолчанию:

  1. Если параметр имеет тип примитив (int , bool, double, ... ) Веб-API пытается получить значение из URI HTTP-запроса.

  2. Для сложных типов (ваш собственный объект, например: Person), веб-API пытается прочитать значение из тела HTTP-запроса.

Итак, если у вас есть:

  • примитивный тип в URI, или
  • сложный тип в теле

... тогда вам не нужно добавлять какие-либо атрибуты (ни [FromBody], ни [FromUri])

Но если у вас есть тип примитива в теле , вам нужно добавить [FromBody] перед параметром примитивного типа в методе контроллера WebAPI. (Поскольку по умолчанию WebAPI ищет примитивные типы в URI HTTP-запроса.)

Или, если у вас есть сложный тип в вашем URI , вы должны добавить [FromUri]. (Поскольку по умолчанию WebAPI ищет сложные типы в теле HTTP-запроса по умолчанию.)

Примитивные типы:

 public class UsersController : ApiController
{
    // api/users
    public HttpResponseMessage Post([FromBody]int id)
    {

    }
    // api/users/id
    public HttpResponseMessage Post(int id)
    {

    }       
}

Сложные типы:

 public class UsersController : ApiController
{       
    // api/users
    public HttpResponseMessage Post(User user)
    {

    }

    // api/users/user
    public HttpResponseMessage Post([FromUri]User user)
    {

    }       
}

Это работает до тех пор, пока вы отправляете только один параметр в своем HTTP-запросе. При отправке нескольких вам нужно создать пользовательскую модель , в которой все ваши параметры будут такими:

 public class MyModel
{
    public string MyProperty { get; set; }
    public string MyProperty2 { get; set; }
}

[Route("search")]
[HttpPost]
public async Task<dynamic> Search([FromBody] MyModel model)
{
    // model.MyProperty;
    // model.MyProperty2;
}

Из документации Microsoft для привязка параметров в ASP.NET Web API :

  

Если параметр имеет значение [FromBody], веб-API использует заголовок Content-Type.   выбрать форматтер. В этом примере тип содержимого   «application /json», а тело запроса представляет собой необработанную строку JSON (не   Объект JSON). Не более одного параметра разрешено читать из   тело сообщения.

     

Это должно работать:

 public HttpResponseMessage Post([FromBody] string name) { ... }
     

Это не будет работать.

 // Caution: This won't work!    
public HttpResponseMessage Post([FromBody] int id, [FromBody] string name) { ... }
     

Причина этого правила в том, что тело запроса может быть сохранено в   небуферизованный поток, который может быть прочитан только один раз.

ответил JedatKinports 7 WedEurope/Moscow2016-12-07T23:52:52+03:00Europe/Moscow12bEurope/MoscowWed, 07 Dec 2016 23:52:52 +0300 2016, 23:52:52
0

Если параметр имеет значение [FromBody], веб-API использует заголовок Content-Type для выбора средства форматирования. В этом примере тип содержимого - «application /json», а тело запроса - необработанная строка JSON (не объект JSON).

Не более одного параметра разрешено читать из тела сообщения. Так что это не сработает:

 // Caution: Will not work!    
public HttpResponseMessage Post([FromBody] int id, [FromBody] string name) { ... }

Причина этого правила заключается в том, что тело запроса может быть сохранено в небуферизованном потоке, который может быть прочитан только один раз

Пожалуйста, посетите веб-сайт для получения более подробной информации: http://www.asp.net/web-api/overview/formats-and-model-binding/parameter-binding-in-aspnet-web-api р>

ответил user5166729 28 J000000Tuesday15 2015, 23:26:53
0

Просто дополнение к вышеуказанным ответам.

[FromUri] также может использоваться для связывания сложных типов из параметров uri вместо передачи параметров из строки запроса

Например.

 public class GeoPoint
{
    public double Latitude { get; set; } 
    public double Longitude { get; set; }
}

[RoutePrefix("api/Values")]
public ValuesController : ApiController
{
    [Route("{Latitude}/{Longitude}")]
    public HttpResponseMessage Get([FromUri] GeoPoint location) { ... }
}

Может быть названо как:

http://localhost/api/values/47.678558/-122.130989
ответил Utkarsh Patel 15 MaramThu, 15 Mar 2018 10:40:57 +03002018-03-15T10:40:57+03:0010 2018, 10:40:57

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132