Разберете обвързването на параметри в ASP.Net Web API

ASP.Net Web API е лека рамка, която може да се използва за изграждане на RESTful HTTP услуги. Когато работите с методи на контролер в уеб API, често ще трябва да предавате параметри на тези методи. "Параметър" тук просто се отнася до аргумента на метод, докато "обвързване на параметри" се отнася до процеса на задаване на стойности на параметрите на методите на уеб API.

Имайте предвид, че има два начина, по които Web API може да обвърже параметри: обвързване на модели и форматиращи устройства. Обвързването на модела се използва за четене от низа на заявката, докато форматиращите устройства се използват за четене от тялото на заявката. Можете също да използвате преобразуватели на типове, за да разрешите на Web API да третира клас като прост тип и след това да обвърже параметъра от URI. За да направите това, ще трябва да създадете персонализиран TypeConverter. Можете също така да създадете персонализирано свързващо устройство, като внедрите интерфейса IModelBinder във вашия клас и след това внедрите метода BindModel. За повече информация относно преобразувателите на типове и свързващите модели, разгледайте тази документация на Microsoft.

Сега, за да обвърже параметри, Web API следва това правило: За прости типове Web API се опитва да получи стойността от URI, а за сложни типове Web API се опитва да получи стойността от тялото на заявката. Простите типове тук се отнасят както за примитивните типове .Net - int, bool, double, float и т.н., така и за други типове, които включват TimeSpan, DateTime, Guid, десетичен и низ. Той също така включва всеки тип, за който е наличен конвертор на типове, който може да конвертира от низ. В следващия раздел ще изследваме атрибутите [FromBody] и [FromUri], използвани за свързване на стойности съответно от тялото на заявката и URI.

Кога да се използват [FromBody] и [FromUri] в уеб API

Ако използвате уеб API от известно време, може да сте запознати с атрибутите [FromBody] и [FromUri]. Атрибутът [FromUri] е с префикс на параметъра, за да посочи, че стойността трябва да се чете от URI на заявката, а атрибутът [FromBody] се използва, за да се посочи стойността да се чете от тялото на заявката.

За всички примитивни типове (int, double, float и др.) Изпълнението на Web API се опитва да прочете стойността от URI на HTTP заявката. За сложни типове (екземпляри на класове), изпълнението на Web API се опитва да прочете стойността от тялото на HTTP заявката с помощта на форматиращ инструмент от медиен тип. Това е поведението по подразбиране на уеб API. 

Следователно, ако имате стойност в URI на заявката, която е примитивен тип, не е необходимо да указвате атрибута [FromUri]. По същия начин, ако имате стойност в тялото на заявката, която е сложен тип, не е необходимо да указвате атрибута [FromBody]. Ако обаче примитивният тип се намира в тялото на заявката или сложният тип се намира в URI на заявката, трябва да посочите атрибута [FromBody] или [FromUri]. Причината е, че се отклонявате от поведението по подразбиране и в двата случая.

Как да използвам [FromBody] и [FromUri] в уеб API

Следният кодов фрагмент илюстрира как можете да посочите атрибута [FromBody] за основен тип данни, предаден като параметър на метод на уеб API.

публичен клас SecurityController: ApiController

{

    публичен HttpResponseMessage Post ([FromBody] int id)

    {

       // Напишете кода си тук

    }

}

И ето кодов фрагмент, който илюстрира как можете да предадете сложен тип като параметър на метод на уеб API, използвайки атрибута FromUri.

публичен клас SecurityController: ApiController

{

    публична публикация на HttpResponseMessage ([Потребител на [FromUri])

    {

       // Напишете кода си тук

    }

}

Трябва да се отбележи, че изпращането на данни за удостоверяване на потребителя като потребителско име и парола чрез URI не е добра практика, дори ако може да използвате SSL. Това е така, защото такива данни могат да бъдат запазени в дневниците на браузъра, където са уязвими на експозиция. Когато предавате чувствителни данни (потребителски имена, пароли, информация за кредитни карти и др.) Чрез тялото на заявката, е задължително да използвате [FromBody] във всеки случай.

Имайте предвид, че когато използвате атрибута [FromBody], докато предавате параметър на метод на уеб API, времето на изпълнение на уеб API се възползва от заглавката на типа съдържание, за да изберете правилния форматиращ инструмент. Можете да научите повече за договарянето на съдържание в уеб API от статията ми тук.