Для полной и актуальной версии статьи посетите: https://code-maze.com/different-ways-consume-restful-api-csharp/
Занимаясь веб-разработкой, вы рано или поздно сталкиваетесь с необходимостью иметь дело с внешними API (интерфейсом прикладного программирования). В этой статье моя цель — составить наиболее полный список способов использования API RESTful в ваших проектах на C # и показать вам, как это сделать, на нескольких простых примерах. После прочтения этой статьи вы получите более полное представление о том, какие варианты доступны для вас и как выбрать правильный вариант в следующий раз, когда вам нужно использовать RESTful API.
Что такое RESTful API?
Итак, прежде чем мы начнем, вам может быть интересно, что такое API и что такое часть RESTful?
Проще говоря, API — это слои между программными приложениями. Вы можете отправить запрос в API, а взамен вы получите ответ от него. API-интерфейсы скрывают все мелкие детали конкретной реализации программного приложения и предоставляют интерфейс, который вы должны использовать для взаимодействия с этим приложением.
Весь интернет — это одна большая паутина, созданная из API. Мы используем API для обмена информацией между приложениями. У нас есть API практически для всего. Большинство сервисов, которыми вы пользуетесь ежедневно, имеют свои собственные API (GoogleMaps, Facebook, Twitter, Instagram, погодные порталы …)
Часть RESTful означает, что API реализован в соответствии с принципами и правилами REST (Transfer State State), который является базовым архитектурным принципом сети. API-интерфейсы RESTful в большинстве случаев возвращают простой текст, JSON или XML-ответ. Более детальное объяснение REST выходит за рамки этой статьи, но вы можете прочитать больше о REST в нашей статье Лучшие рекомендации по REST API .
Как использовать RESTful API
Хорошо, давайте перейдем к мясной части всей этой истории.
Есть несколько способов использовать RESTful API в C #:
- HttpWebRequest / класс ответа
- Класс WebClient
- Класс HttpClient
- Пакет RestSharp NuGet
- ServiceStack Http Utils
У каждого из них есть свои плюсы и минусы, поэтому давайте рассмотрим их и посмотрим, что они предлагают.
В качестве примера, мы будем собирать информацию о репо-релизах RestSharp и датах их публикации через GitHub API. Эта информация доступна публично, и вы можете увидеть, как выглядит необработанный ответ JSON: RestSharp релизы .
Мы собираемся использовать помощь библиотеки Json.NET для десериализации полученного нами ответа. Кроме того, для некоторых примеров мы собираемся использовать встроенные механизмы десериализации библиотек. Вам решать, какой путь вы предпочитаете, потому что ни один путь не является правильным. (Вы можете увидеть реализацию обоих механизмов в исходном коде ).
В результате следующих нескольких примеров я ожидаю получить десериализованный JArray (для простоты), который содержит информацию о выпуске RestSharp. После этого мы можем выполнить итерацию, чтобы получить следующий результат.
HttpWebRequest / Класс ответа
Это специфичная для HTTP реализация WebRequest
класса, которая первоначально использовалась для обработки HTTP-запросов, но она устарела и заменена классом.
В HttpWebRequest
предлагает класс мелкозернистого контроля над каждым аспектом процесса запроса решений. Как вы можете себе представить, это может быть обоюдоострым мечом, и вы можете легко потерять огромное количество времени на настройку ваших запросов. С другой стороны, это может быть именно то, что вам нужно для вашего конкретного случая.
HttpWebRequest
Класс не блокирует пользовательский интерфейс, который, я уверен , что вы согласитесь с этим, очень важно.
HttpWebResponse
Класс предоставляет контейнер для входящих ответов.
Это простой пример того, как использовать API с помощью этих классов.
Джава
xxxxxxxxxx
1
var request = (HttpWebRequest) WebRequest.Create("https://api.github.com/repos/restsharp/restsharp/releases");
2
request.Method = "GET";
3
request.UserAgent = "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36";
4
request.AutomaticDecompression = DecompressionMethods.Deflate | DecompressionMethods.GZip;
5
var response = (HttpWebResponse) request.GetResponse();
6
string content = string.Empty;
7
using(var stream = response.GetResponseStream()) {
8
using(var sr = new StreamReader(stream)) {
9
content = sr.ReadToEnd();
10
}
11
}
12
var releases = JArray.Parse(content);
Хотя это простой пример, он становится намного сложнее, когда вам приходится иметь дело с более сложными сценариями, такими как размещение информации о форме, авторизация и т. Д.
Класс WebClient
Этот класс является оберткой вокруг HttpWebRequest
. Это упрощает процесс, абстрагируя детали HttpWebRequest
от разработчика. Код легче написать, и вы с меньшей вероятностью допустите ошибки таким образом. Если вы хотите писать меньше кода, не беспокоиться обо всех деталях, и скорость выполнения не имеет значения, рассмотрите возможность использования WebClient
класса.
Этот пример должен дать вам общее представление о том, насколько проще использовать по сравнению с HttpWebRequest/HttpWebResponse
подходом.
Джава
xxxxxxxxxx
1
var client = new WebClient();
2
client.Headers.Add("user-agent", "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36");
3
var response = client.DownloadString("https://api.github.com/repos/restsharp/restsharp/releases");
4
var releases = JArray.Parse(response);
Намного проще, правда?
Помимо DownloadString
метода, WebClient
класс предлагает множество других полезных методов, которые делают нашу жизнь проще. Мы можем легко манипулировать строками, файлами или байтовыми массивами, используя его, и по цене всего на несколько миллисекунд медленнее, чем HttpWebRequest/HttpWebResponse
подход.
И классы, HttpWebRequest/HttpWebResponse
и WebClient
классы доступны в более старых версиях .NET. Не забудьте проверить MSDN, если вы заинтересованы в том, что еще WebClient
может предложить.
Класс HttpClient
HttpClient
является «новым ребенком в блоке» и предлагает некоторые из современных функций .NET, которых нет в старых библиотеках. Например, вы можете отправить несколько запросов с одним экземпляром HttpClient
, так как он не привязан к конкретному HTTP-серверу или хосту и использует механизм async / await.
Вы можете узнать о пяти веских причинах использования HttpClient в этом видео :
- Сильно типизированные заголовки.
- Общие кэши, файлы cookie и учетные данные.
- Доступ к файлам cookie и общим файлам cookie.
- Контроль над кешированием и общим кешем.
- Вставьте свой модуль кода в конвейер ASP.NET. Более чистый и модульный код.
Вот HttpClient
в действии в нашем примере:
Джава
xxxxxxxxxx
1
using(var httpClient = new HttpClient()) {
2
httpClient.DefaultRequestHeaders.Add("User-Agent", "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36");
3
var response = httpClient.GetStringAsync(new Uri(url)).Result;
4
var releases = JArray.Parse(response);
5
}
Ради простоты я реализовал это синхронно. Каждый HttpClient
метод должен использоваться асинхронно и ДОЛЖЕН использоваться таким образом.
Кроме того, мне нужно упомянуть еще одну вещь. Существует дискуссия о том, HttpClient
следует ли заключать в блок с использованием или статически на уровне приложения. Несмотря на то IDisposable
, что он реализуется , кажется, что, обернув его в блок using, вы можете сделать ваше приложение неисправным и получить исключение SocketException . И как ANKIT блоги, результаты тестирования производительности являются значительно в пользу статической инициализации из HttpClient
. Обязательно прочитайте эти сообщения в блоге, так как они могут помочь вам получить больше информации о правильном использовании HttpClient
класса .
И не забывайте, что современность HttpClient
эксклюзивна для .NET 4.5, поэтому у вас могут возникнуть проблемы с ее использованием в некоторых устаревших проектах.
RestSharp
RestSharp — это альтернатива OpenSource стандартным библиотекам .NET и одна из самых классных библиотек .NET. Он доступен в виде пакета NuGet, и есть несколько причин, по которым вам стоит попробовать его.
Как и HttpClient, RestSharp представляет собой современную и всеобъемлющую библиотеку, простую и приятную в использовании, и в то же время поддерживающую более старые версии .NET Framework. Он имеет встроенные механизмы аутентификации и сериализации / десериализации, но позволяет вам переопределить их с вашими. Он доступен на разных платформах и поддерживает OAuth1, OAuth2, Basic, NTLM и аутентификацию на основе параметров. Вы можете работать как синхронно, так и асинхронно. У этой библиотеки гораздо больше, и это лишь некоторые из ее преимуществ. Для получения подробной информации об использовании и возможностях RestSharp вы можете посетить страницу RestSharp на GitHub .
Теперь давайте попробуем получить список выпусков RestSharp, используя RestSharp:
Джава
xxxxxxxxxx
1
var client = new RestClient(url); IRestResponse response = client.Execute(new RestRequest()); var releases = JArray.Parse(response.Content);
Достаточно просто. Но не дайте себя одурачить, RestSharp очень гибок и имеет все инструменты, необходимые для достижения практически чего угодно при работе с RESTful API.
В этом примере нужно отметить одну вещь: я не использовал механизм десериализации RestSharp из-за последовательности примера, что является пустой тратой, но я призываю вас использовать его, так как он действительно прост и удобен. Таким образом, вы можете легко сделать контейнер следующим образом:
Джава
xxxxxxxxxx
1
public class Release {
2
[DeserializeAs(Name = "name")] public string Name {
3
get;
4
set;
5
} [DeserializeAs(Name = "published_at")] public string PublishedAt {
6
get;
7
set;
8
}
9
}
И после этого используйте Execute
метод для прямой десериализации ответа на этот контейнер. Вы можете добавить только нужные вам свойства и использовать атрибут, DeserializeAs
чтобы сопоставить их со свойствами C # (приятное прикосновение). Поскольку мы получаем список выпусков в нашем ответе, мы используем List <Release> как содержащий тип.
Джава
xxxxxxxxxx
1
var client = new RestClient(url);
2
var response = client.Execute < List < Release >> (new RestRequest());
3
var releases = response.Data;
Довольно простой и элегантный способ получения наших данных.
RestSharp — это намного больше, чем отправка GET-запросов, поэтому изучите и убедитесь сами, насколько это круто.
И последнее замечание, которое следует добавить к случаю RestSharp, — это то, что его хранилище нуждается в сопровождающих. Если вы хотите узнать больше об этой классной библиотеке, я призываю вас перейти к репо RestSharp и помочь этому проекту остаться в живых и стать еще лучше. Вы также можете помочь перенести RestSharp на .NET Core .
ServiceStack Http Utils
Еще одна библиотека, но в отличие от RestSharp, ServiceStack, кажется, поддерживается должным образом и идет в ногу с современными тенденциями API. Список возможностей ServiceStack впечатляет, и он, безусловно, имеет различные приложения.
Здесь нам наиболее полезно продемонстрировать, как использовать внешний RESTful API. ServiceStack имеет специализированный способ работы с HTTP-API сторонних производителей, который называется Http Utils .
Давайте посмотрим, как выглядит выборка релизов RestSharp с использованием служебных программ ServiceStack Http, в первую очередь с использованием анализатора Json.NET.
Джава
xxxxxxxxxx
1
var response = url.GetJsonFromUrl(requestFilter: webReq => {
2
webReq.UserAgent = "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36";
3
});
4
var releases = JArray.Parse(response);
Вы также можете оставить его для анализатора ServiceStack. Мы можем повторно использовать Release
класс, определенный ранее в посте.
Джава
x
1
List<Release> releases = url.GetJsonFromUrl(requestFilter: webReq => { webReq.UserAgent = "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36"; }).FromJson<List<Release>>();
Как видите, любой из этих способов работает нормально, и вы можете выбрать, получите ли вы строковый ответ или немедленно десериализовать его.
Хотя ServiceStack — последняя библиотека, на которую я наткнулся. Я был приятно удивлен, насколько легко мне было его использовать, и я думаю, что в будущем он может стать моим основным инструментом для работы с API и сервисами.
Другие варианты
Есть много других вариантов, доступных для ваших конкретных проблем. Эти библиотеки предназначены для использования одной службы REST. Например, octokit.net используется специально для работы с API GitHub, Facebook SDK используется для использования API-интерфейсов Facebook, и есть много других практически для чего угодно.
Хотя эти библиотеки созданы специально для этих API-интерфейсов и могут отлично выполнять то, для чего они предназначены, их полезность ограничена, поскольку вам часто приходится подключаться к нескольким API-интерфейсам в ваших приложениях. Это может привести к различным реализациям для каждой и большему количеству зависимостей, что потенциально приводит к повторяемости и подвержено ошибкам. Чем конкретнее библиотека, тем меньше у нее гибкости.
Заключение
Итак, подведем итог, мы поговорили о различных инструментах, которые вы можете использовать для использования RESTful API. Я упомянул некоторые библиотеки .NET, которые могут сделать это, такие как HttpWebRequest, WebClient и HttpClient, а также некоторые удивительные сторонние инструменты, такие как RestSharp и ServiceStack. Я дал вам очень краткое введение в эти инструменты и сделал несколько очень простых примеров, чтобы показать вам, как вы можете начать их использовать.
Я считаю, что вы по крайней мере на 95% готовы потреблять немного REST. Выйдите и раскройте свои крылья, исследуйте и находите еще более причудливые и интересные способы использования и подключения различных API. Спи спокойно сейчас, ты знаешь путь.
Какой ваш любимый способ использовать RESTful API? Есть ли какие-то пропущенные в этом списке, о которых я должен знать? Обязательно оставьте мне комментарий и дайте мне знать.
Исходный код на GitHub
Для полной и актуальной версии статьи посетите: https://code-maze.com/different-ways-consume-restful-api-csharp/