Надсилання даних html-форми до веб-API ASP.NET: дані з кодом форми
У цій статті показано, як надсилати дані form-urlencoded в контролер веб-API.
Огляд HTML-форм
Html-форми використовують get або POST для надсилання даних на сервер. Атрибут метод елемента форми надає метод HTTP:
За промовчанням використовується метод GET. Якщо форма використовує GET, ці форми кодуються в URI у вигляді рядка запиту. Якщо у формі використовується POST, ці форми містяться в тексті запиту. Для даних POSTed атрибут enctype задає формат тексту запиту:
| enctype |
Опис |
| application/x-www-form-urlencoded |
Дані форми кодуються у вигляді пар "ім'я-значення", аналогічно рядку запиту URI. Це стандартний формат для POST. |
| multipart/form-data |
Дані форми кодуються як складове повідомлення MIME. Використовуйте цей формат під час надсилання файлу на сервер. |
У частині 1 цієї статті розглядається формат x-www-form-urlencoded. Частина 2 описує багатокомпонентний MIME.
Надсилання складних типів
Як правило, відправляється складний тип, що складається із значень, взятих із кількох елементів управління форми. Розглянемо наступну модель, що становить оновлення стану:
namespace FormEncode.Models < using System; використовуючи System.ComponentModel.DataAnnotations; public class Update < [Required] [MaxLength(140)] public string Status < get; set; >public DateTime Date < get; set; >> >
Нижче наведено контролер веб-API, який приймає об'єкт Update через POST.
namespace FormEncode.Controllers < using FormEncode.Models; using System; використовуючи System.Collections.Generic; using System.Net; using System.Net.Http; using System.Web; using System.Web.Http; public class UpdatesController : ApiController < static readonly Dictionaryupdates = new Dictionary(); [HttpPost] [ActionName("Complex")] public HttpResponseMessage PostComplex(Update update) < if (ModelState.IsValid && update != null) < // Convert any HTML markup в текстовому статуї. update.Status = HttpUtility.HtmlEncode(update.Status); // Assign a new ID. var updates[id] = update; // Create a 201 response. var response = New HttpResponseMessage(HttpStatusCode.Created) < Content = New StringContent(update.Status) >; response.Headers.Location = new Uri(Url.Link("DefaultApi", new < action = "status", >)); return response; > else < return Request.CreateResponse(HttpStatusCode.BadRequest); >> [HttpGet] Public Update Status(Guid id) < Update update; if (updates.TryGetValue(id, out update)) < return update; >else < throw new HttpResponseException(HttpStatusCode.NotFound); >> > >
Цей контролер використовує маршрутизацію з урахуванням дій, тому шаблон маршруту — api///. Клієнт буде надсилати дані в "/api/updates/complex".
Тепер напишемо HTML-форму, щоб користувачі відправили оновлення стану.
Complex Type
Зверніть увагу, що атрибут дії у формі є універсальним кодом ресурсу (URI) дії контролера. Нижче наведено форму з деякими значеннями, введеними в:
Коли користувач натискає кнопку Надіслати, браузер відправляє HTTP-запит, аналогічний:
POST http://localhost:38899/api/updates/complex HTTP/1.1 Accept: text/html, application/xhtml+xml, */* User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64 ; Trident/5.0) Content-Type: application/x-www-form-urlencoded Content-Length: 47 status=Shopping+at+the+mall.&date=6%2F15%2F2012
Зауважте, що текст запиту містить дані форми, відформатовані у вигляді пар "ім'я-значення". Веб-API автоматично перетворює пари "ім'я-значення" на екземпляр Update класу .
Надсилання даних форми за допомогою AJAX
Коли користувач надсилає форму, браузер переходить з поточної сторінки і відображає текст повідомлення у відповідь. Це нормально, якщо відповідь є HTML-сторінкою. Однак під час використання веб-API текст відповіді зазвичай порожній або містить структуровані дані, такі як JSON. У цьому випадку є сенс надіслати ці форми за допомогою запиту AJAX, щоб сторінка раніше обробляла відповідь.
У наступному коді показано, як публікувати ці форми за допомогою jQuery.
Функція jQuery submit замінює дію форми новою функцією. Це перевизначає стандартну поведінку кнопки Надіслати. Функція serialize серіалізує дані форми в парі "ім'я-значення". Щоб надіслати дані форми на сервер, зателефонуйте . $.post()
Після завершення запиту .success() обробник або .error() виводить користувачеві відповідне повідомлення.
Надсилання простих типів
У попередніх розділах ми надіслали складний тип, який веб-API десеріалізував у екземпляр класу моделі. Ви також можете надсилати прості типи, такі як рядок.
Перед надсиланням простого типу рекомендується запакувати значення у складний тип. Це дає переваги перевірки моделі на стороні сервера та спрощує розширення моделі за потреби.
Основні дії з відправлення простого типу однакові, але є дві незначні відмінності. По-перше, у контролері необхідно прикрасити ім'я параметра атрибутом відBody .
[HttpPost] [ActionName("Simple")] public HttpResponseMessage PostSimple([FromBody] string value) < if (value != null) < Update update = New Update() < Status = HttpUtility.HtmlEncode(value .UtcNow >; updates[id] = update; var response = new HttpResponseMessage(HttpStatusCode.Created) < Content = new StringContent(update.Status) >; response.Headers.Location = new Uri(Url.Link "status", >)); response; > else
За промовчанням веб-API намагається отримати прості типи з URI запиту. відBody повідомляє веб-API, що потрібно зчитувати значення тексту запиту.
Веб-API зчитує текст відповіді не більше одного разу, тому лише один параметр дії може надходити з тексту запиту.
По-друге, клієнту необхідно надіслати значення у наступному форматі:
Зокрема, частина імені пари "ім'я-значення" повинна бути порожньою для простого типу.
$.post('api/updates/simple', < "": $('#status1').val() >);
Нижче наведено приклад форми:
Нижче наведено скрипт для надсилання значення форми. post .
$('#form2').submit(function() < var jqxhr = $.post('api/updates/simple', < "": $('#status1').val() >) .success(function () < var loc = jqxhr.getResponseHeader('Location'); >);$('#message').html(a); >.error(function() < $('#message').html("Error posting the update."); >);
Для надсилання масиву простих типів можна використовувати той самий підхід:
$.post('api/updates/postlist', < "": ["update one", "update two", "update three"] >);
14) Інтерв'ю Asp.Net Web API: питання та відповіді
WebAPI – це фреймворк, який допомагає вам створювати/розробляти HTTP-сервіси.
2) Чому потрібний веб-API? Чи можна використовувати послуги RESTful з використанням WCF?
Так, ми ще можемо розробляти RESTful-сервіси з WCF. Однак є дві основні причини, які спонукають користувачів використовувати веб-API замість служб RESTful.
- Web API розширює підхід TDD (Test Data Driven) розробки сервісів RESTful.
- Якщо ми хочемо розробляти сервіси RESTful у WCF, вам, безумовно, знадобиться багато конфігураційних налаштувань, шаблонів URI, контрактів та кінцевих точок для розробки сервісів RESTful з використанням веб-API.
3) Навіщо вибирати веб-API?
- Він використовується для створення простих HTTP-сервісів, не заснованих на SOAP
- Це також простий спосіб створення за допомогою веб-API. З WCF REST Services
- Він заснований на HTTP і простий у визначенні, представленні та використанні в режимі REST.
- Це легка архітектура та ідеально підходить для пристроїв з обмеженою пропускною здатністю, таких як смартфони.
4) Чи правильно, що ASP.NET Web API замінив WCF?
Зовсім не правда, що ASP.NET Web API замінив WCF. Фактично це ще один спосіб створення сервісів, які не засновані на SOAP, т.е. е. Простий XML або рядки JSON.
5) Які переваги веб-API?
- OData
- фільтри
- Узгодження контенту
- Self-хостинг
- Маршрутизація
- Прив'язки моделей
6) Які основні типи даних, що повертаються, підтримуються в Web API?
Дія контролера Web API може повертати такі значення:
- Void - поверне порожній контент
- HttpResponseMessage — перетворює відповідь на повідомлення HTTP.
- IHttpActionResult — внутрішньо викликає ExecuteAsync для створення HttpResponseMessage
- Інші типи — ви можете записати серіалізоване значення, що повертається в тіло відповіді
7) Веб-API підтримує якийсь протокол?
Веб-програма підтримує протокол HTTP.
8) Яка платформа .NET підтримує веб-API?
NET 4.0 та вище версія підтримує веб-API.
9) Веб-API використовує якусь із наступних бібліотек з відкритим вихідним кодом для серіалізації JSON?
Web API використовує бібліотеку Json.NET для серіалізації JSON.
10) За замовчуванням Web API надсилає HTTP-відповідь з яким із наступних кодів стану для всіх необроблених винятків?
внутрішня помилка сервера 500
11) Що є найбільшим недоліком "Інші типи повернення" у веб-API?
Найбільшим недоліком цього підходу є те, що ви не можете безпосередньо повернути код помилки, наприклад 404 error.
12) Як ви будуєте HtmlResponseMessage?
Нижче наведено спосіб зробити це,
public class TestController : ApiController < public HttpResponseMessage Get() < HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.OK, "value"); response.Content = new StringContent("Testing", Encoding.Unicode); response.Headers.CacheControl = новий CacheControlHeaderValue() < MaxAge = TimeSpan.FromMinutes(20) >; return response; > >
13) Що таке маршрутизація через веб-інтерфейс?
Маршрутизація - це зіставлення зі зразком, як у MVC.
Усі маршрути зареєстровані у таблицях маршрутів.
Routes.MapHttpRoute( Name: "ExampleWebAPIRoute", routeTemplate: “api// defaults: new < > 14) Що таке SOAP?
SOAP — це формат XML-повідомлень, який використовується у взаємодіях веб-служб. Це дозволяє надсилати повідомлення через HTTP або JMS, але можуть використовуватися інші транспортні протоколи. Це також протокол обміну повідомленнями на основі XML для обміну інформацією між комп'ютерами.
15) У чому перевага використання REST у веб-API?
REST is used to make fewer data transfers між клієнтом і сервером, які матимуть його для використання в mobile apps. Web API також підтримує HTTP protocol. Існує,наскільки відновлюються традиційні способи HTTP verbs for communication.
16) Як можна використовувати Web API with ASP.NET Web Form?
Web API може бути використаний з ASP.NET Web Form
It can be performed in three simple steps:
- Create a Web API Controller,
- Add a routing table to Application_Start method of Global.sax
- Вони потребують отримання jQuery AJAX Call до Web API метод і отримати дані.
17) Як вам може бути обмеження Access до Web API до Спеціального HTTP Verb?
Під час програмування гравців є важлива функція.
18) Можна використовувати Web API with ASP.NET Web Form?
Yes, It is possible to use Web API with ASP.Net Web form.
19) How Can assign alias name for ASP.NET Web API Action?
We can give alias name for Web API action sam as in case of ASP.NET MVC за допомогою "ActionName" attribute as follows:
[HttpPost] [ActionName("SaveStudentInfo")] public void UpdateStudent(Student aStudent)
20) What is the meaning of TestApi?
TestApi є utility library of APIs.
21) Explain exception filters?
It will be executed when exceptions є unhandled and thrown from controller method. The reason for the exception can be anything.
22) How can we register exception filter from the action?
We can register exception filter from action using following code:
[NotImplExceptionFilter] public TestCustomer GetMyTestCustomer(int custid) < //write the code >
23) How you can return View from ASP.NET Web API method?
No, we can't return a view from ASP.NET Web API метод.
24) How to register exception filter globally?
It is possible to register exception filter Globally using following code-
25) Поясніть, що таке ВІДПОЧИНОК і ВІДПОЧИНОК?
REST представляє REpresentational State Transfer; це зовсім новий аспект написання веб-додатку.
RESTFUL: термін, написаний із застосуванням архітектурних концепцій REST, називається RESTful-сервісами. Основна увага приділяється системним ресурсам та тому, як стан ресурсу має передаватися за протоколом HTTP.
26) Дайте мені приклад Web API Routing?
Config.Routes.MapHttpRoute( name: "MyRoute,"//route name routeTemplate: "api///",//as you can see "API" is at the beginning. defaults: new < >);
27) Як можна обробляти помилки в веб-API?
У Web API є кілька класів для обробки помилок. Це HttpError, Фільтри винятків, HttpResponseException та Реєстрація фільтрів винятків.
28) Які нові функції входять до ASP.NET Web API 2.0?
Останні можливості ASP.NET Web API framework v2.0:
- Маршрутизація атрибутів
- Обмін ресурсами між джерелами
- Зовнішня автентифікація
- Відкритий веб-інтерфейс NET
- HttpActionResult
- OData веб-API
29) Як можна обмежити методи доступу конкретними HTTP-дієсловами у Web API?
За допомогою атрибутів (наприклад, HTTP-дієслів) можна реалізувати обмеження доступу до веб-API.
Можна визначити дієслова HTTP як атрибут обмеження доступу. Приклад:
[HttpPost] public void Method1(Class obj) < //logic
30) Як можна передати кілька складних типів у веб-API?
Два способи передачі складних типів у веб-API
Використання масивів ArrayList та Newtonsoft
31) Написати код передачі ArrayList в веб-API?
ArrayList paramList = новий ArrayList(); Category c = new Category <CategoryId = 1, CategoryName = "MobilePhones">; Product p = new Product < Productcode = 1, Name = "MotoG", Price = 15500, CategoryID = 1>; paramList.Add(c); paramList.Add(p);
32) Назвіть інструменти чи API для розробки чи тестування веб-API?
Інструменти тестування для веб-сервісів для REST API включають:
33) Що таке ВІДПОЧИНОК?
ВІДПОЧИНОК - архітектурний стиль. Він визначив керівні принципи для створення сервісів, які масштабуються.REST використовується з протоколом HTTP, використовуючи його дієслова GET, PUT, POST та DELETE.
34) Як зробити модульне тестування веб-API?
Ми можемо виконати модульне тестування за допомогою інструментів Web API, таких як Fiddler.
Ось деякі налаштування, які потрібно виконати, якщо ви використовуєте
Fiddler –Compose Tab -> Введіть заголовки запиту -> Введіть тіло запиту та виконайте
35) Як ми можемо обмежити доступ до методів із конкретними HTTP-дієсловами в Web API?
Програмування атрибутів широко використовується для цієї функції. Веб-API також дозволяє обмежувати доступ до методів, що викликають, за допомогою певних HTTP-дієслів. Також можна визначити HTTP-дієслова як атрибути за методом.
36) Що таке використання DelegatingHandler?
DelegatingHandler використовується в Web API для подання обробників повідомлень перед маршрутизацією.
37) Як ми можемо зареєструвати фільтр виключень із дії?
Ми можемо зареєструвати фільтр виключень із дії, використовуючи наступний код
[NotImplExceptionFilter] public TestCust GetMyTestCust (int custno) < //write the code >
38) Підкажіть фрагмент коду, щоб показати, як ми можемо повернути 404 помилки з HttpError?
Код для повернення помилки 404 з HttpError
string message = string.Format («TestCustomer не знайдено», customerid);
return Request.CreateErrorResponse (HttpStatusCode.NotFound, message);
39) Поясніть фрагмент коду для реєстрації фільтрів виключень із контролера?
[NotImplExceptionFilter] public class TestCustController : Controller < //Your code goes here >
40) Який протокол підтримує веб-API?
Веб-програма підтримує протокол HTTP
41) Який із наступних .NET Framework підтримує Web API?
Web API підтримується версією NET 4.0
42) Яка бібліотека використовує веб-API для серіалізації JSON?
Web API використовує бібліотеку Json.NET для серіалізації JSON.
43) За промовчанням Web API відправляє HTTP-відповідь із яким із наступних кодів стану всім необроблених винятків?
внутрішня помилка сервера 500
44) Поясніть метод обробки помилок, використовуючи HttpError у веб-API?
WEB API HttpError використовується для видачі інформації про помилку в тілі відповіді. Метод CreateErrorResponse також може використовуватися разом з цим, який є методом розширення, визначеним в HttpRequestMessageExtension.
45) Як ми можемо зареєструвати фільтр винятків глобально?
Ми можемо зареєструвати фільтр виключень глобально, використовуючи наступний код:
GlobalConfiguration.Configuration.Filters.Add (New MyTestCustomerStore.NotImplExceptionFilterAttribute());
46) Як обробляти помилки у веб-API?
У Web API є кілька класів для обробки помилок. Це HttpError, HttpResponseException, фільтри винятків, реєстрація фільтрів винятків.
47) У чому перевага WebAPI перед WCF?
WCF-служби використовують протокол SOAP, а HTTP ніколи не використовує протокол SOAP. Ось чому послуги WebAPI легкі, оскільки SOAP не використовується. Це також зменшує дані, що передаються для відновлення обслуговування. Більше того, йому ніколи не потрібно надто багато налаштувань. Отже, клієнт може взаємодіяти зі службою за допомогою HTTP-дієслів.
48) Відмінності у стані між MVC та WebAPI
MVC Framework використовується для розробки додатків, які мають інтерфейс користувача. Для цього уявлення можуть бути використані для створення інтерфейсу користувача.
WebAPI використовується для створення HTTP-сервісів. Інші програми також можуть називатися методами WebAPI для отримання цих даних.
49) Хто може використовувати WebAPI?
WebAPI може використовуватися будь-яким клієнтом, який підтримує HTTP-дієслова, такими як GET, PUT, DELETE, POST. Оскільки сервіси WebAPI не потребують будь-якої конфігурації, їх легко використовувати будь-якому клієнту.Шкода навіть портативні пристрої, такі як мобільні пристрої, можуть легко споживати WebAPI, що, безумовно, є найбільшою перевагою цієї технології.
50) Як ми можемо переконатися, що Web API повертає лише дані JSON?
Щоб змусити Web API серіалізувати об'єкт, що повертається у формат JSON і повертати тільки дані JSON. Для цього ви повинні додати наступний код до класу WebApiConfig.cs у будь-якому проекті MVC Web API:
//JsonFormatter //MediaTypeHeaderValue Config.Formatters.JsonFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("application/json")); 1 2 3 //JsonFormatter //MediaTypeHeaderValue Config.Formatters.JsonFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("application/json"))
Який із наступних форматів даних запиту відповіді підтримує Web API за промовчанням?
Це керівництво застаріло. Актуальний посібник: Посібник з ASP.NET Core
Якщо ми звернемося до контролера Web API для отримання деякого списку об'єктів, наприклад, за стандартним маршрутом api/values/, то в IE ми отримаємо ці об'єкти у форматі json, а Firefox і Chrome - у форматі xml. Наприклад, у нас є наступний метод:
Public List Get() < return new List < new Book , new Book , //. >; >
У Firefox ми отримаємо наступний результат:
Л. Толстой
1
Війна та мир
І. Тургенєв
2
Батьки та діти
При взаємодії з клієнтом між ним та сервером відбуваються два процеси: content negotiation (узгодження вмісту) та media formatting (Форматування або серіалізація вмісту). На першому етапі сервер дізнається, у якому форматі клієнту краще надсилати відповідь. На другому етапі відбувається серіалізація даних у цей формат.
Дані про формат клієнт передає за допомогою заголовка Accept. Різні браузери відправляють різні заголовки Accept. Наприклад, в IE цей заголовок виглядає наступним чином: Accept: text/html, application/xhtml+xml, */* . Частина */* вказує, що дані можуть бути прийняті у будь-якому форматі.Тому IE отримує у форматі json - кращому для Web API форматі. Однак в інших браузерах цей заголовок може виглядати іншим чином, наприклад Accept: text/html, application/xhtml+xml, application/xml;q=0.9,*/*;q=0.8 . Тут вже явно вказується за допомогою application/xml, що браузер хоче отримувати дані у форматі xml.
Web API має вбудовану підтримку для таких форматів: JSON, BSON, XML. Якщо в запиті не передається заголовок Accept, то використовується формат за замовчуванням - json.
Однак ми можемо явно вказати програмі, щоб вона надсилала дані у форматі json. Для цього у файл WebApiConfig.cs додамо рядок:
using System; використовуючи System.Collections.Generic; використовуючи System.Linq; using System.Web.Http; namespace TestWebApiApp < public static class WebApiConfig < public static void Register(HttpConfiguration config) < config.MapHttpAttributeRoutes(); config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api//", defaults: new < >); // відключаємо можливість виведення даних у форматі xml config.Formatters.Remove(config.Formatters.XmlFormatter); > > >
Узгодження формату на стороні сервера здійснює спеціальний клас, який представляє реалізацію інтерфейсу IContentNegotiator.
public interface IContentNegotiator < ContentNegotiationResult Negotiate(Type type, HttpRequestMessage request, IEnumerableformatters); >
Єдиний метод інтерфейсу Negotiate отримує тип даних, дані запиту та набір форматувальників MediaTypeFormatter, які серіалізують дані у відповідь клієнту. А як результат методу використовується об'єкт ContentNegotiationResult.
Якщо результат методу дорівнює null, то у відповідь клієнту відправляється статусний код 406 (Unacceptable). Цей код вказує на неможливість серіалізації даних у потрібний формат.
За промовчанням Web API вже містить реалізацію цього стандартного інтерфейсу - клас DefaultContentNegotiator . Але нам може знадобитися перевизначити стандартну поведінку цього класу.Наприклад, нам треба віддавати клієнту з ОС Android дані у форматі json. Для цього ми можемо додати до проекту наступний клас:
using System; використовуючи System.Collections.Generic; using System.Net.Http; using System.Net.Http.Formatting; using System.Net.Http.Headers; Public class MyNegotiator : DefaultContentNegotiator < public override ContentNegotiationResult Negotiate(Type type, HttpRequestMessage request, IEnumerableformatters) < if(request.Headers.UserAgent.ToString().ToLower().ToLower(). ContentNegotiationResult(new JsonMediaTypeFormatter(), new MediaTypeHeaderValue("application/json") ); >return base.Negotiate(type, request, formatters); > >
Тут ми перевіряємо, чи містить рядок UserAgent підрядок "android", і якщо містить, віддаємо дані у форматі json.
Але просто визначити клас ще замало. Тепер потрібно перевизначити конфігурацію Web API. Для цього відкриємо файл WebApiConfig.cs, який знаходиться в папці App_Start, і додамо до нього один рядок:
public static class WebApiConfig < public static void Register(HttpConfiguration config) < config.Services.Replace(typeof(IContentNegotiator), New MyNegotiator()); //. решта вмісту файлу >>
Спосіб config.Services.Replace() замінює стандартний тип DefaultContentNegotiator вищевизначеним класом для участі у відповідності вмісту.
І тепер на всі браузери під керуванням ОС Андроїд буде надходити контент у форматі json.
Однак необов'язково перевизначати клас DefaultContentNegotiator, ми також можемо скористатися стандартними методами:
- Json(content) : серіалізує контент у json
- Content(status, content, formatter) : серіалізує контент у певний формат за допомогою класу formatter
- Content(status, content, formatter, mimeType) : те саме, тільки використовується об'єкт MediaTypeHeaderValue для визначення mime-типу
- Content(status, content, formatter, mimeString) : аналогічно попередньому, тільки mime-тип визначається у вигляді рядка
Ці методи перевизначають стандартний процес узгодження контенту. Наприклад, щоб явно відправляти дані у форматі json, використовуємо метод Json():
public IHttpActionResult Get() < return Json(new List< new Book , new Book , //. >);