Статьи

Разработка веб-API ASP.NET

ASP.NET Web API — это структура для создания веб-API поверх .NET Framework, которая использует HTTP. Поскольку практически любая платформа, о которой вы только можете подумать, имеет библиотеку HTTP, службы HTTP могут использоваться широким кругом клиентов, включая браузеры, мобильные устройства и традиционные настольные приложения.

ASP.NET Web API использует концепции HTTP и предоставляет такие функции, как:

  • Поддерживаются различные типы запросов / ответов, такие как HTML, JSON и двоичные файлы (изображения / аудио / видео), а не только контент XML, как того требует SOAP.
  • Встроенное отображение действий в контроллере, основанное на HTTP-глаголах (GET, POST и т. Д.)

Для создания веб-API мы будем использовать Visual Studio. Если у вас есть Visual Studio 2012 или более поздняя версия, тогда вы все можете начать с веб-API.

В меню « Файл» выберите « Создать», а затем « Проект» .

На панели « Шаблоны» выберите « Установленные шаблоны» и разверните узел Visual C # . Под Visual C # выберите Интернет . В списке шаблонов проектов выберите ASP.NET Web Application . Установите предпочитаемое имя для проекта и нажмите ОК .

Начиная новый проект в Visual Studio

В следующем окне вам будет представлен список шаблонов. Хотя вы можете выбрать любой из шаблонов из списка, так как все они будут содержать файлы DLL и конфигурации, необходимые для создания контроллеров Web API, для начала мы выберем Пустой шаблон проекта.

Выбор шаблона проекта WEB API

В Web API контроллер — это объект, который обрабатывает HTTP-запросы. Давайте быстро добавим контроллер для тестирования нашего веб-API.

В обозревателе решений щелкните правой кнопкой мыши папку « Контроллеры ». Выберите Добавить, а затем выберите Контроллер . Мы вызовем контроллер TestController и выберем Empty API Controller из опций Scaffolding для Template.

Добавление первого API-контроллера

Visual Studio создаст наш контроллер, производный от класса ApiController . Давайте добавим быструю функцию, чтобы протестировать наш проект API, разместив его в IIS .

1
2
3
4
public IEnumerable<string> Get()
       {
           return new string[] { «hello», «world» };
       }

Теперь мы добавим наш сервис в IIS, чтобы получить к нему доступ локально. Откройте IIS и щелкните правой кнопкой мыши веб-сайт по умолчанию, чтобы добавить наш веб-сервис.

Хостинг в IIS

В диалоговом окне « Добавление приложения » назовите свой TestAPI службы и укажите путь к корневому пути проекта Visual Studio, как показано ниже.

Добавление нового приложения в IIS

Нажмите кнопку ОК, и наш веб-сервис API готов.

Чтобы проверить, все ли работает нормально, давайте попробуем следующий URL в любом браузере: http: // localhost / TestAPI / api / test .

Если вы назвали свой контроллер TestController как я, а также назвали свою веб-службу в IIS как TestAPI, то ваш браузер должен вернуть файл XML, как показано ниже, со строковыми значениями hello world .

Ответ от тестового контроллера

Однако если ваш IIS не имеет разрешения для папки проекта, вы можете получить сообщение об ошибке: « Запрошенная страница не может быть доступна, потому что соответствующие данные конфигурации для этой страницы недопустимы».

Если вы получаете этот тип ошибки, вы можете устранить ее, предоставив доступ на чтение / запись к группе пользователей IIS_IUSRS в корневую папку.

Теперь давайте посмотрим, как работает URL, который мы указали браузеру.

ASP.NET Routing обрабатывает процесс получения запроса и сопоставления его с действием контроллера. Маршрутизация веб-API похожа на маршрутизацию MVC, но с некоторыми отличиями; Web API использует тип HTTP-запроса вместо имени действия в URL (как в случае с MVC), чтобы выбрать действие, которое будет выполнено в контроллере.

Конфигурация маршрутизации для веб-API определяется в файле WebApiConfig.cs . Конфигурация маршрутизации по умолчанию ASP.NET Web API выглядит следующим образом:

01
02
03
04
05
06
07
08
09
10
11
public static class WebApiConfig
   {
       public static void Register(HttpConfiguration config)
       {
           config.Routes.MapHttpRoute(
               name: «DefaultApi»,
               routeTemplate: «api/{controller}/{id}»,
               defaults: new { id = RouteParameter.Optional }
           );
       }
   }

Шаблон маршрутизации по умолчанию для Web API — api/{controller}/{id} . Вот почему у нас есть « api » в нашем URL http: // localhost / TestAPI / api / test .

Когда веб-API получает запрос GET для определенного контроллера, список совпадающих действий — это все методы, имя которых начинается с GET. То же самое относится ко всем остальным HTTP-глаголам. Правильный метод действия, который должен быть вызван, определяется путем сопоставления сигнатуры метода.

Это соглашение об именах для методов действий может быть переопределено с помощью HttpGet ,
Атрибуты HttpPut , HttpPost или HttpDelete с методами действия.

Итак, если мы заменим наш предыдущий код следующим:

1
2
3
4
5
[HttpGet]
       public IEnumerable<string> Hello()
       {
           return new string[] { «hello», «world» };
       }

И нажмите http: // localhost / TestAPI / api / test в нашем браузере, это все равно вернет тот же результат. Если мы удалим атрибут HttpGet , наш веб-API не сможет найти соответствующее действие для нашего запроса.

Теперь давайте добавим еще один метод с тем же именем Hello, но с другой подписью.

1
2
3
4
5
[HttpGet]
       public IEnumerable<string> Hello(string id)
       {
           return new string[] { id, «world» };
       }

Используя этот метод, мы теперь можем контролировать то, что возвращается от нашего Сервиса до некоторой степени. Если мы протестируем этот метод, вызвав http: // localhost / TestAPI / api / test / namaste (обратите внимание на дополнительный параметр в конце URL), мы получим следующий вывод:

Ответ от тестового контроллера 2

Итак, теперь у нас есть два метода с именем Hello . Один не принимает никаких параметров и возвращает строки «hello world», а другой метод принимает один параметр и возвращает » yourparameter world».

Хотя мы не предоставили имя нашего метода для выполнения в нашем URL-адресе, маршрутизация ASP.NET по умолчанию воспринимает запрос как запрос GET и на основе подписи запроса (параметры предоставляются), конкретный метод выполняется. Это нормально, если в нашем контроллере есть только один метод GET или POST, но, поскольку в любом реальном бизнес-приложении обычно имеется более одного такого метода GET, этой маршрутизации по умолчанию недостаточно.

Давайте добавим еще один метод GET, чтобы увидеть, как с этим справляется маршрутизация по умолчанию.

1
2
3
4
5
[HttpGet]
       public IEnumerable<string> GoodBye()
       {
           return new string[] { «good bye», «world» };
       }

Если мы сейчас создадим наш проект и вызовем http: // localhost / TestAPI / api / test / в нашем браузере, мы получим сообщение об ошибке « Найдено несколько действий, соответствующих запросу », что означает, что система маршрутизации идентифицирует два действия, соответствующие запросу GET.

Ответ об ошибке от тестового контроллера

Чтобы иметь возможность использовать несколько запросов GET с одного и того же контроллера, нам нужно изменить идентификатор типа HTTP-запроса на идентификатор на основе действий, чтобы можно было вызывать несколько запросов GET.

Это можно сделать, добавив следующую конфигурацию маршрута перед конфигурацией по умолчанию в WebApiConfig.cs .

1
2
3
4
5
config.Routes.MapHttpRoute(
               name: «DefaultApi2»,
               routeTemplate: «api/{controller}/{action}/{id}»,
               defaults: new { id = RouteParameter.Optional }
           );

Теперь протестируйте все три метода, вызвав эти URL:

Теперь, когда основная идея о том, как действия от контроллеров могут быть представлены через API, понятна, давайте посмотрим, как можно разработать службу API для клиентов.

Изображение 9 Поток структуры сервиса Web API

Конвейер запросов ASP.NET Web API получает запросы от клиентского приложения, и в контроллере будет вызываться метод действия. Метод действия, в свою очередь, вызывает бизнес-уровень для извлечения или обновления данных, который, в свою очередь, вызывает класс Repository для возврата данных из базы данных.

Основываясь на этом шаблоне разработки, давайте создадим пример API, который предоставляет список классифицированных элементов в качестве службы своим клиентам.

Создайте класс с именем классификационной модели в папке Models .

1
2
3
4
5
6
7
8
public class ClassifiedModel
   {
       public int ClassifiedID { get;
       public string ClassifiedTitle { get;
       public string ClassifiedDetail { get;
       public DateTime CreatedDate { get;
       public string ClassifiedImage { get;
   }

Создайте две папки BLL и DAL, представляющие уровень бизнес-логики и уровень доступа к данным.

Создайте класс с именем классифицированным репозиторием в папке DAL, где мы будем жестко кодировать некоторые данные для классифицированного списка и выставлять список статическим методом.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
public class ClassifiedRepository
   {
       //list of Classified Objects
       public static List<ClassifiedModel> classifiedList;
 
       /// <summary>
       /// get list of classified models
       /// </summary>
       /// <returns></returns>
       public static List<ClassifiedModel> GetClassifiedsList()
       {
           if (classifiedList == null
           ||
           {
               CreateClassifiedsList();
           }
           return classifiedList;
       }
 
       /// <summary>
       /// Init a list of classified items
       /// </summary>
       private static void CreateClassifiedsList()
       {
           classifiedList = new List<ClassifiedModel>()
           {
               new ClassifiedModel()
               {
                   ClassifiedID = 1,
                   ClassifiedTitle = «Car on Sale»,
                   ClassifiedDetail = «Car details car details car details»,
                   CreatedDate = DateTime.Now,
                   ClassifiedImage = «/carImageUrl.jpg»
               },
 
               new ClassifiedModel()
               {
                   ClassifiedID = 2,
                   ClassifiedTitle = «House on Sale»,
                   ClassifiedDetail = «House details house details house details»,
                   CreatedDate = DateTime.Now,
                   ClassifiedImage = «/houseImageUrl.jpg»
               },
 
               new ClassifiedModel()
               {
                   ClassifiedID = 3,
                   ClassifiedTitle = «Room for rent»,
                   ClassifiedDetail = «Room details room details room details»,
                   CreatedDate = DateTime.Now,
                   ClassifiedImage = «/roomImageUrl.jpg»
               },
 
               new ClassifiedModel()
               {
                   ClassifiedID = 4,
                   ClassifiedTitle = «Tree on Sale»,
                   ClassifiedDetail = «Tree details tree details tree details»,
                   CreatedDate = DateTime.Now,
                   ClassifiedImage = «/treeImageUrl.jpg»
               }
 
           };
       }
   }

Давайте теперь добавим еще один класс классифицированного сервиса в папку BLL . Этот класс будет содержать статический метод для доступа к хранилищу и возврата бизнес-объектов в контроллер. На основании параметров поиска метод вернет список классифицированных предметов.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
public class ClassifiedService
   {
       public static List<ClassifiedModel> GetClassifieds(string searchQuery)
       {
           var classifiedList = ClassifiedRepository.GetClassifiedsList();
 
           if (!string.IsNullOrEmpty(searchQuery))
           {
               return (from m in classifiedList
                       where m.ClassifiedTitle.StartsWith(searchQuery, StringComparison.CurrentCultureIgnoreCase)
                       select m).ToList();
           }
           return classifiedList;
       }
   }

Наконец, теперь мы создадим наш контроллер веб-API для методов, связанных с классифицированным листингом.

По аналогии с тем, как мы создали наш первый TestController , давайте создадим контроллер API с пустыми действиями чтения / записи, которые называются AttraController , и добавим следующие два метода Action.

01
02
03
04
05
06
07
08
09
10
11
public class ClassifiedsController : ApiController
   {
       public List<ClassifiedModel> Get(string id)
       {
           return ClassifiedService.GetClassifieds(id);
       }
       public List<ClassifiedModel> Get()
       {
           return ClassifiedService.GetClassifieds(«»);
       }
   }

Теперь у нас есть два Действия через API. Первый метод GET будет вызван, если есть ключевое слово для поиска, которое передается вместе с запросом. Если входного параметра нет, будет вызван второй метод GET. Оба метода вернут список объектов нашей Классифицированной модели.

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

Чтобы отобразить результаты, содержащие параметр поиска « house », нажмите следующий URL в браузере: http: // localhost / TestAPI / api / adss / get / house .

Мы должны получить следующий ответ в браузере:

GET Запрос с домом в качестве параметра

Чтобы увидеть весь список объявлений, нажмите на URL, не передавая никаких параметров: http: // localhost / TestAPI / api / adss / get / .

Вы должны увидеть следующий результат:

GET-запрос без каких-либо параметров

Мы можем добавить любое количество действий и контроллеров тем же способом, который требуется клиентам.

До сих пор мы видели примеры API, которые отправляют XML-ответы клиентам. Теперь давайте рассмотрим другие типы контента, такие как JSON и Image response, которые относятся к теме согласования контента.

Спецификация HTTP (RFC 2616) определяет согласование содержимого как « процесс выбора наилучшего представления для данного ответа, когда доступно несколько представлений ». Благодаря функции согласования содержимого Web API клиенты могут сообщать службам Web API, какой формат содержимого он принимает. и Web API может обслуживать клиента в том же формате автоматически при условии, что формат настроен в Web API.

Заголовок HTTP Accept используется для указания типов носителей, которые приемлемы для
клиент для ответов. Для XML значение устанавливается как « application / xml », а для JSON «application / json ».

Чтобы протестировать наш API с заголовками HTTP Accept, мы можем использовать расширения, доступные для браузеров, которые позволяют нам создавать собственные HTTP-запросы.

Здесь я использую расширение под названием HTTP Tool, доступное для Mozilla Firefox, для создания заголовка Accept, в котором в качестве типа ответа указывается JSON.

Создание заголовков HTTP-запросов

Как видно из изображения, полученный ответ представлен в формате JSON.

Наконец, давайте посмотрим, как мы можем отправить файл изображения в ответ через Web API.

Давайте создадим папку с именем Images и добавим в нее изображение с именем default.jpg , а затем добавим следующий метод Action в наш PartsController .

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
public HttpResponseMessage GetImage()
       {
           byte[] bytes = System.IO.File
                          .ReadAllBytes
                          (
                               HttpContext.Current.Server
                               .MapPath(«~/Images/default.jpg»)
                          );
            
           var result = new HttpResponseMessage(HttpStatusCode.OK);
 
           result.Content = new ByteArrayContent(bytes);
 
           result.Content.Headers.ContentType = new MediaTypeHeaderValue(«image/png»);
           return result;
       }

Также должны быть включены эти два пространства имен: System.Web, System.Web.Http.

Здесь мы создаем HTTP-ответ с использованием класса HttpResponseMessage и устанавливаем байты изображения в качестве содержимого ответа. Кроме того, мы устанавливаем заголовок Content-Type на « image / png ».

Теперь, если мы вызовем это действие в нашем браузере, Web API отправит изображение default.jpg в ответ: http: // localhost / TestAPI / api / adss / Getimage / .

Отправка изображения в ответ от веб-API

В этом руководстве мы рассмотрели, как веб-API ASP.NET можно легко создавать и предоставлять клиентам как методы действий контроллеров MVC. Мы рассмотрели стандартную и настраиваемую систему маршрутизации, создали базовую структуру службы API бизнес-приложений в реальном времени, а также рассмотрели различные типы ответов.

И если вы ищете дополнительные утилиты для покупки, просмотра или использования, ознакомьтесь с. NET предложение в CodeCanyon .

Надеюсь, вам понравился этот урок, и он оказался полезным для создания ваших веб-API для мобильных устройств. Благодарность!