В этом посте я продемонстрирую, как выполнять вызовы RESTful API из приложения C #. Я решил использовать в демо Zomato API, так как это официальный и хорошо документированный API.

RESTful API соответствуют архитектурному стилю REST. Прежде чем переходить к реализации, давайте узнаем о REST (или обновим то, что мы об этом знаем).
Что такое REST?
REST или RE презентационный S tate T ransfer - это архитектурный стиль, обеспечивающий стандарты между компьютерными системами на web, что упрощает взаимодействие систем друг с другом.
REST полагается на отношения клиент-сервер. По сути, это означает, что клиентское приложение и серверное приложение должны иметь возможность развиваться отдельно, без какой-либо зависимости друг от друга.
REST не имеет состояния. Это означает, что связь между клиентом и сервером всегда содержит всю информацию, необходимую для выполнения запроса. На сервере нет состояния сеанса, оно полностью остается на стороне клиента.
REST обеспечивает единый интерфейс между компонентами. Ресурсы предоставляют URI, подобные структуре каталогов.
REST не имеет прямого отношения к HTTP, но чаще всего ассоциируется с ним. Есть четыре основных HTTP-команды, которые мы используем в запросах для взаимодействия с ресурсами в системе REST:
- GET - получить определенный ресурс (по идентификатору) или набор ресурсов.
- POST - создать новый ресурс
- PUT - обновить конкретный ресурс (по id)
- УДАЛИТЬ - удалить определенный ресурс по идентификатору.
В системе REST представления передают JSON или XML для представления объектов данных и атрибутов.
REST оказал такое большое влияние на Интернет, что по большей части вытеснил дизайн интерфейса на основе SOAP, поскольку это значительно более простой стиль в использовании.
Кроме того, предлагаю это видео для наглядного представления концепции.
Теперь, когда мы сделали краткий обзор REST, мы можем перейти к реализации.
Как вызвать RESTful API?
Как я упоминал ранее, для этой демонстрации мы будем вызывать API Zomato.
Сначала заходим на страницу Zomato API и получаем API-ключ.
На вкладке Документация мы видим, как использовать конечные точки API.
Мы будем использовать конечную точку /search для просмотра списка ресторанов в городе. Но перед этим нам нужен идентификатор города, который будет использоваться в этой конечной точке. Итак, сначала мы используем конечную точку /cities следующим образом:

И мы узнаем, что идентификатор города - 59 для Стамбула.

Чтобы увидеть рестораны в Стамбуле, мы вводим следующие параметры в конечную точку /search, как показано ниже:

После нажатия кнопки Попробовать мы получаем URL-адрес API в следующем виде:
https://developers.zomato.com/api/v2.1/search?entity_id=59&entity_type=city
Мы добавляем наш ключ API к этому URL:
https://developers.zomato.com/api/v2.1/search?entity_id=59&entity_type=city&apikey={Your API Key}
Затем мы вставляем его в браузер и получаем ответ JSON, как показано ниже:

Мы можем использовать http://jsoneditoronline.org/ для просмотра древовидной структуры данных JSON. Я вставил на сайт версию JSON с необработанными данными и получил следующее:

Мы будем использовать эту древовидную структуру объектов в нашем коде для формирования классов модели JSON, которые будут использоваться при десериализации.
Теперь давайте создадим консольное приложение в Visual Studio и добавим необходимые классы модели.
Для самого внешнего объекта мы создаем RestaurantList класс:
Как вы видите на картинке, он состоит из массива с именем restaurants. Мы создаем следующие классы для определения элементов массива:
И каждый restaurant объект включает location object, поэтому мы создаем следующий класс:
Хочу отметить, что нам достаточно включить нужные нам поля в определения классов. Кроме того, обратите внимание на аннотацию данных, которую мы использовали перед определениями полей. Это JsonProperty, и его важно добавить, чтобы сопоставить поля класса с полями данных JSON.
Теперь давайте воспользуемся этими классами, чтобы составить список ресторанов Стамбула.
Перед написанием классов вызовов API мы должны установить пакет клиентских библиотек веб-API. В консоли диспетчера пакетов мы вводим следующую команду:
Install-Package Microsoft.AspNet.WebApi.Client
После выполнения команды в наш проект добавляются необходимые библиотеки.
Затем мы создаем класс APICall, как показано ниже:
Здесь основная функция:

Эта функция
· Создает HTTP-клиент с параметрами URL

· Отправляет запрос GET на указанный URI в виде асинхронной операции

· Сериализует содержимое HTTP в строку как асинхронную операцию

· Десериализует JSON в объект .NET (типа T)

Я хочу отметить, что мы используем здесь универсальные шаблоны (тип T), чтобы мы могли использовать эту функцию для десериализации ответов от разных типов конечных точек на связанные с ними объекты .NET.
Затем мы добавляем класс ZomatoInfo, который будет вызывать RunAsync функцию класса APICall:
Обратите внимание, что вы должны ввести свой ключ API в urlParameters.
Наконец, мы вызываем эту функцию из нашего Program класса в нашем приложении:
И получаем результат:

Надеюсь, вы могли бы последовать за мной и получить какой-то результат. Поздравляю тогда :)
В дальнейшем я использовал /reviews конечную точку для просмотра отзывов о Nusr-Et Steakhouse (мы видим, что id = 5915530 для этого ресторана на скриншоте выше). После выполнения вышеупомянутых шагов для этой конечной точки и их реализации я получил текущие обзоры для Nusr-Et, как показано ниже:

Вы можете увидеть полный проект в этом репозитории Github. Вкратце, чтобы показать обзоры, я просто добавил необходимые классы модели JSON и реализовал функцию GetReviews в классе ZomatoInfo, а затем вызвал ее из программы main. Хотя я использовал другой класс модели для десериализации, я не внес никаких изменений в класс APICall. В этом сила Generics :)
Наконец, я хочу добавить сюда два полезных видео. Вы можете посмотреть их, если хотите узнать больше о двух концепциях, которые мы использовали во время реализации: Асинхронное программирование и Десериализация JSON .
На этом я заканчиваю этот пост. Надеюсь, вам было легко читать и понимать.
Пока!
P.S. Меня не спонсируют Zomato или Nusr-Et :)
Ссылки
Https://www.codecademy.com/articles/what-is-rest
Https://developer.ibm.com/articles/ws-restful/
Https://spring.io/understanding/REST
Https://ninenines.eu/docs/en/cowboy/2.6/guide/rest_principles/