Angular HttpClient новый модуль для создания запросов, установка и принципы работы


Содержание материала:

Angular 4 Параметры запроса HttpClient

Я искал способ передать параметры запроса в вызов API с помощью нового HttpClientModule HttpClient и еще не нашел решение. Со старым модулем Http вы должны написать что-то вроде этого.

Это приведет к вызову API по следующему URL-адресу:

Однако новый HttpClient get() метод не имеет свойства search , поэтому мне интересно, куда передать параметры запроса?

http angular lodash typescript httpclient

8 ответов

140 Решение joshrathke [2020-08-02 23:37:00]

В итоге я нашел его с помощью IntelliSense в функции get() . Итак, я опубликую это здесь для всех, кто ищет подобную информацию.

В любом случае, синтаксис почти идентичен, но немного отличается. Вместо использования URLSearchParams() параметры должны быть инициализированы как HttpParams() а свойство в функции get() теперь называется params а не search .

Я на самом деле предпочитаю этот синтаксис, поскольку он немного более независим от параметров. Я также переработал код, чтобы сделать его немного более сокращенным.

Несколько параметров

Наилучший способ, который я нашел до сих пор, — определить объект Params со всеми параметрами, которые я хочу определить. Как отметил @estus в комментарии ниже, в этом вопросе есть много хороших ответов о том, как назначить несколько параметров.

Несколько параметров с условной логикой

Еще одна вещь, которую я часто делаю с несколькими параметрами, — это использование нескольких параметров без необходимости их присутствия в каждом вызове. Используя Lodash, довольно просто условно добавить/удалить параметры из вызовов API. Точные функции, используемые в Lodash, Underscores или vanilla JS, могут различаться в зависимости от вашего приложения, но я обнаружил, что проверка определения свойств работает довольно хорошо. Приведенная ниже функция будет передавать только те параметры, которые имеют соответствующие свойства, в переменную параметров, переданную в функцию.

64 JayChase [2020-12-15 10:33:00]

Вы можете (в версии 5+) использовать конструктор fromObject и fromString при создании HttpParamaters, чтобы сделать вещи немного легче

Как настроить baseUrl для Angular HttpClient?

В документации я не нашел способа установить URL базового API для всех запросов http. Можно ли это сделать с Angular HttpClient?

5 ответов

Используйте новый HttpClient Interceptor.

Создайте правильную HttpInterceptor которая реализует HttpInterceptor :

HttpInterceptor может клонировать запрос и изменять его по своему желанию, в этом случае я определил путь по умолчанию для всех запросов http.

Предоставьте HttpClientModule со следующими конфигурациями:

Теперь все ваши запросы будут начинаться с your-api-url/

Основываясь на очень полезном ответе TheUnreal , можно написать перехватчик, чтобы получить базовый URL через DI:

BASE_API_URL может быть предоставлен модулем приложения:

где environment — это объект, автоматически создаваемый CLI при создании проекта:

Почему бы не создать подкласс HttpClient с настраиваемым baseUrl? Таким образом, если вашему приложению необходимо обмениваться данными с несколькими службами, вы можете использовать разные подклассы для каждого или создать несколько экземпляров одного подкласса, каждый из которых имеет свою конфигурацию.

Я думаю, что по умолчанию нет способа сделать это. Сделайте HttpService, и внутри вы сможете определить свойство вашего URL по умолчанию и создать методы для вызова http.get и других с вашим URL свойства. Затем введите HttpService вместо HttpClient

вам не обязательно нужен базовый URL с HttpClient , в документации сказано, что вам просто нужно указать API-часть запроса, если вы делаете вызовы на один и тот же сервер, это просто так:

Однако вы можете, если хотите или хотите, указать базовый URL.

У меня есть 2 предложения для этого:

1 Вспомогательный класс со статическим свойством класса.

2 Базовый класс со свойством класса, поэтому любой новый сервис должен расширять его:

WEB start

Компьютеры. Интернет. Заочное профессиональное обучение. 055-966-10-17

Обучение

Широкий спектр программ и различных форм обучения

Возможность заочного, дистанционного обучения

  • Программирование. Современные языки и технологии.
  • Обслуживание персональных компьютеров.
  • Компьютерные сети. Защита информации.
  • Интернет. Планирование, создание WEB-сайтов. Дизайн, программирование. CEO, продвижение сайтов в интернет.
  • Основы современных IT — технологий.

Наши преимущества

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

Курсы WEB

Закончив наш курс, вы научитесь самостоятельно строить коммерческие интернет сайты любой сложности, управлять их размещением на WEB — хостинге, оптимизировать их и «продвигать» в Интернете.

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

Узнать подробнее

Регистрация на сайте

Angular HttpClient — работа с HTTP запросами

Использование HttpClient

Angular HttpClient — класс, который предоставляет пользователям удобный интерфейс для работы с HTTP запросами, он базируется на использовании XMLHttpRequest объекта браузера — .

Для использования HttpClient API нужно импортировать модуль HttpClientModule (обычно — в app.module.ts):

После этого можно использовать HttpClient в классе Angular — приложений, импортируя HttpClient и подключая его через dependancy injection. Например, создав сервис, который будет отвечать за передачу данных но HTTP:

Объект, созданный из HttpClient (в примере выше — myHttp), поддерживает методы:

Для тестирования приложения Angular, которое работает с HttpClient можно использовать, например:

  • Angular модуль: HttpClientTestingModule,
  • специальные online сервисы, типа: http://jsonplaceholder.typicode.com/ , https://www.jsontest.com/,
  • nodeJs (Angular in-memory web API: npm i angular-in-memory-web-api@0.5.3 —save ).
  • Или любой другой WEB server, который будет обрабатывать HTTP запросы.

Простой пример — get()

Простой пример использования метода get() Http клиента — файл на локальном диске, который содержит данные в формате JSON.

Создадим айл с именем: myData.json

Расположим его в папке src/assets/data

Создадим компонент get-data

this.myHttp — наш объект типа HttpClient

this.myHttp.get(‘assets/data/myData.json’) — метод get() этого объекта, который получает в качестве рапаметра — URL , где расположен источник данных в формате JSON

Этот метод возвращает в качестве результата Angular объект типа Observable. Это — массив данных, элементв которого формируются асинхронно, динамически, в результате запроса.

У этого объекта есть метод — subscribe(), который позволяет получать данные в формате JSON.

Мы задали (в формате arrow — function) параметр этого меода — функцию с аргументом reslt, которая выполнится по эго окончании (call-back function). В переменную reslt subscribe поместит результат выполнения.

Этот результат можно запомнить в переменной класса и использовать в шаблоне компонента (при интерпретации данных в примере используется Angular pipe — json для форматирования данных ).

PHP — server side

Далее , для тестирования используем на сервере PHP — программу (myAngularGetV2.php).

Программа на PHP запущена локально (URL = http://angularhttp/myAngularGetV2.php).

Программа получает запрос от Angular и отвечает на него.

Рассмотрим метод HttpClient.get().

Эта программа получает запрос от Angular — приложения и отдаёт ему нужные данные (данные эти в нашем случае хранятся в переменной $outstr, в реальной жизни, скорее всего PHP берёт их из базы данных)

Результат — такой же, как при чтении из файла на диске.

Передача данных от Angular на сервер по get()

Усложним немного запрос от Angular к серверу.

Для этого в метод get() добавим ещё один допустимый параметр — params и передадим через него на сервер имя пользователя.

Вызов get() примет вид:

Мы передаём теперь на сервер по методу get параметр Name со значением Anna

Теперь сервер получает запрос с параметром. PHP — программа на сервере может этот запрос проанализиолвать и дать ответ в соответствии с этим параметром.

В нашем случае заведём в программе массив данных — $students и в этом массиве найдём того, чьё имя соответствует параметру запроса.

В ответ сервера (JSON ) вставим данные только найденного студента.

В переменную $stud получили искомого студента

В цикле foreach перебираем массив, ищем нужного.

Если нашли — формируем строке $outstring ответ в формате JSON и командой echo отправляем ответ (до этого функциями header мы сформировали необходимый набор HTTP заголовков ).

Шаблон (используем Angular — pipe json для ворматирования данных):

Angular 5 — Невозможно установить заголовок для HttpClient

Я пытаюсь сделать POST-вызов, используя HttpClient в проекте Angular 5, и я хочу установить заголовок:

По какой-то причине заголовок Content-Type , по-видимому, отсутствует в запросе, который я делаю.

6 ответов

Если я правильно вижу, то вы показываете нам предварительный запрос OPTIONS (CORS), а не фактический запрос POST.

Должно быть 2 «рассматриваемых запроса». Метод http для одного должен быть OPTIONS (тот, который вы показали здесь, он называется preflight cors request) и один фактический POST (если сервер разрешает это для вашего клиента). Если хост отличается от locahost:4200 , что, как я предполагаю, означает, что вы должны включить запросы cors на вашем сервере для localhost:4200 client.

поскольку HttpHeaders является неизменным, мы должны назначить его

Это сработало для меня. Вместо добавления.

Попробуйте тоже, у меня была та же проблема;)

Дело в том, что проект построен на локальном хосте с использованием узла и сохраняет эти данные о хосте и порте по умолчанию, вы можете изменить его при сборке проекта

примечание: отправьте ‘id’ как ‘String’, обратите внимание на приведенную ниже модификацию

Лучшие angular-httpclient вопросы ИТ разработчиков

ɵ (Тета-подобный) символ в исходном коде Angular 2+

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

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

я есть нижеinterceptor auth-interceptor.service.ts import from ‘@angular/core’; import from ‘@angular/common/http’; import from .

Моя версия RxJs: «6.2.2» Надеюсь, это помогло!

ли я использовать обещание в течениеHttpInterceptor? Например: export class AuthInterceptor implements HttpInterceptor< this.someService.someFunction() .then((data)=>< //do something with data and then return next.handle(req); >); >зачем мне .

Вы видели ответ @ Voicu выше?

аюсь получить данные через REST с угловым 2 HttpClient. Я слежу за угловым уроком здесьhttps://angular.io/tutorial/toh-pt6 [https://angular.io/tutorial/toh-pt6]и подГерои и HTTPВ этом разделе вы увидите фрагмент кода, который используется для .

Theres новая ошибка Ошибка: не удается найти другой поддерживающий объект ‘[object Object]’ типа ‘object’. NgFor поддерживает только привязку к итерациям, таким как массивы

ужна помощь в отображении результатов подписки из API в Angular 4. Как я могу сделать это, так как я написал data.data.data, но он говорит, что данные свойства не существуют для объекта типа. Как бы я вывести его в браузере? Вот мой код ниже и .

и в configureTestingModule вашего теста сделайте следующее:

инаю новый угловой проект с CLI и не работаю с провайдером дляHttpClient ошибка. я добавилHttpClientModule в мой модуль импорта, который, кажется, является обычным виновником в этом сценарии. Не нахожу много онлайн кроме этого, таким образом, я .

если у вас есть варианты

аюсь отправить запрос POST из Angular 4 на мой сервер Laravel. Мой LoginService имеет этот метод: login(email: string, password: string) < return this.http.post(`http://10.0.1.19/login`, < email, password >) >Я подписываюсь на этот метод в моем .

создание нового интерфейса просто для переноса данных, а затем для его развертывания — не лучший подход

ываю API, который возвращает объект JSON. Мне нужно только значение массива для сопоставления с наблюдаемой. Если я вызываю api, который просто возвращает массив, мой сервисный вызов работает. Ниже мой пример кода .. // my service call .. .

У меня была такая же проблема, и я использовал, как это. (С помощью FormData) попробуйте. Это работает для меня.

еюсь, что у всех все отлично. Я недавно начал работать с Angular 4.4, я пытался отправить данные на мой сервер API, но, к сожалению, это не работает. Я потратил на это как 2 дня, но все равно безуспешно. И уже попробовал 6-7 статьи даже .

Это помогло мне после того, как я почесал голову в течение 2 часов. Благодарю вас

екте мы использовали Http и HttpClient для получения параметров заголовка. Http возвращает параметры заголовка, но HttpClient нет. constructor(private http: Http, private httpClient: HttpClient) <> getContent() < const url = ''; return .

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

ользую Angular 4 HTTP-клиент на сервер, который возвращает текстовые данные, поэтому я сделал что-то вроде ниже this.http.get(‘assets/a.txt’).map((res:Response) => res.text()).subscribe((data: any) => < console.log(data.text()); >);Я нигде не .

, Перехватчики всегда должны начинаться с исходного запроса. Если запрос является изменяемым и может быть изменен во время предыдущего запуска перехватчиков, это условие не может быть выполнено. Поэтому запрос и все его составные части должны быть неизменными.

ментация для HttpClientутверждает следующее об неизменности: [https://angular.io/guide/http#immutability]Существуют перехватчики для проверки и изменения исходящих запросов и входящих ответов. Однако может быть удивительным узнать, что классы .

я решаю это литье мои параметры заголовка, как это

учаю ошибку компиляции по типу возвращаемого значения при использовании HttpClient. В моей функцииGetPortfolioЯ ожидаюGET вызов для возврата объекта типа jsonObservable

но это дает ошибку: ТипObservable нельзя .

вместо статического чтения.

аюсь абстрагировать некоторые вызовы HttpClient (.get (. ) и .post (. )) в класс BaseService, поскольку мне приходится дублировать код, такой как заголовки и учетные данные, если мои службы этого не делают. наследовать от базового класса. При .

Компонент подписчик и использование:

ужно скачать Excel из моего бэкэнда, он вернул файл. Когда я делаю запрос, я получаю ошибку: Ошибка типа: вы указали «неопределенное» там, где ожидался поток. Вы можете предоставить Observable, Promise, Array или Iterable. Мой .

Это замечательно. Спасибо @Shubham

траиваю Angular все время с новым Проектом. Любой может предложить хороший пример, где нет необходимости разрабатывать базовые требуемые функции, которые требуются в большинстве случаев в приложении. Аутентификация JWT в Angular 6Начальная .

Если вы хотите, вы можете иметь все внутри вашего компонента.

дал вызов API REST в своем приложении Angular, которое загружает файл. Я устанавливаю responseType в ‘blob’, так как я ожидаю файл в ответ. Но когда на сервере нет доступного файла, в ответе указан код ошибки 404, т. Е. Неверный запрос с .

в качестве самого ответа уже JSON. измените это следующим образом,

обновления моего проекта, чтобы использоватьHttpClient модуль вместоHttp модуль, следующий больше не работает. Проблема вProperty json does not exist on type object, Мне нужно получитьitems свойство. Как мне этого добиться? private .

Введение в Angular HttpClient

Angular 4.3 дает нам новый более простой способ обработки HTTP запросов с библиотекой HttpClient. Он доступен под новым именем, чтобы избежать внесения изменений в текущую библиотеку Http. HttpClient также предоставляет нам расширенные функции, такие как возможность прослушивания событий прогресса и перехватчиков для мониторинга или изменения запросов или ответов.

Устновка

Во первых, вам нужно будет импортировать HttpClientModule из @angular/common/http в ваше приложение:

И тогда вы сможете использовать HttpClient.

Базовое использование

Выполнение базовых запросов GET, POST, PUT, PATCH или DELETE очень похоже на то, с чем вы привыкли использовать в старом API Http. Одно из главных отличий заключается в том, что по умолчанию ожидается ответ в формате JSON, поэтому нет необходимости явно анализировать ответ JSON.

Вот пример запроса GET:

Eсли вы ожидаете не JSON в качестве ответа, вы можете указать ожидаемый тип ответа, используя объект с ключом responseType:

Вы также можете определить интерфейс для формы ответа и проверки типа с этим интерфейсом:

По умолчанию HttpClient возвращает тело ответа. Вы можете передать объект с ключом observe, установленным на значение «response», чтобы получить полный ответ. Это может быть полезно для проверки определенных заголовков:

Post, put и patch запросы

Выполнение запроса POST, PUT или PATCH так же просто:

Обратите внимание, что нам еще нужно вызвать метод subscribe, чтобы запрос был сделан. Без вызова subscribe запрос не отправляется. Вероятно, вы захотите обработать и ошибку:

Ошибка запроса имеет тип HttpErrorResponse и содержит, среди прочего, имя ошибки, сообщение об ошибке и состояние сервера.

Дополнительные параметры для заголовков передаваемых сообщений или параметров запроса также могут быть добавлены к запросу POST, PUT или PATCH с использованием заголовков или ключей params в переданном объекте в качестве третьего аргумента:

Обратите внимание на использование классов HttpParams и HttpHeaders. Их нужно будет импортировать их из @angle/common/http.

События статуса загрузки

Отличная новая функция с HttpClient — возможность слушать события прогресса. Это можно сделать по любому типу запроса, и в течение жизненного цикла события запроса будет доступна различная информация. Вот полный пример с запросом GET:

  • Сначала нам нужно создать объект запроса, создав экземпляр класса HttpRequest и используя параметр reportProgress.
  • Затем мы подписываемся на наш объект запроса, чтобы инициировать запрос и прослушивать разные типы событий в течение срока действия запроса. Мы можем реагировать соответствующим образом в зависимости от типа события. Доступные типы событий: Sent, UploadProgress, ResponseHeader, DownloadProgress, Response и User.
  • В приведенном выше примере мы получаем объем данных, загружаемых до сих пор из ответа GET, а в случае чего-то вроде запроса POST или PUT мы также можем получить процент загружаемой полезной нагрузки, используя что-то вроде 100 * event.loaded / event.total. Это позволяет легко показать индикатор выполнения пользователю.

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

Angular — How to use HttpClientModule?

Angular 4.3 introduced a new module, HttpClientModule , which is a complete rewrite of the existing HttpModule .

This article will show you how to easily migrate to this new module, and why you should (spoiler: because it’s way better ��).

Here is a short v >HttpClientModule .

The rest of the article focuses on what you have to do to migrate your apps. It assumes an app generated with Angular CLI, but if that’s not your case, you’ll still be able to follow, minus some file names that might differ for you.

Migrate your application

The first step is to remove the @angular/http package from your package.json file. Indeed the new HttpClientModule is in the @angular/common/http package, and @angular/common should already be in your package.json file.

Save your file, and run NPM or Yarn to update the node_modules . You should start to see compilation errors in your application, as all the imports from @angular/http are now breaking. That’s good, because it tells you all the files you’ll have to migrate.

The first obvious one is your app.module.ts file, which contains your main NgModule. Replace HttpModule with HttpClientModule in your module’s imports field, and update the TypeScript import from:

The second step is to replace every instance of the service Http with the new service HttpClient . This is will usually be the case in your services. This is where using the new HttpClient will shine: you don’t have to manually extract the JSON anymore \o/!

So a service which was looking like that:

can be rewritten as:

Feels good to remove this code, doesn’t it?

Migrate your tests

Now let’s move on to the unit tests.

Testing services with HTTP requests was really verbose with HttpModule … You probably had something like:

You can now use the new testing API, which is much, much nicer:

That should remove a lot of errors you have or all of them.

Maybe you were also adding headers or params to your requests. The new HttpClient allows it too:

In the example above, I set the JWT token needed in the Authorization header. This is something you probably repeat a lot of times in your services, as every request needs it.

The new module introduces a very interesting feature: interceptors. These interceptors are called for every request and response, and allow to easily handle tasks like adding a header to every request, or handling errors in a generic way for example.

First create your interceptor:

Then add your custom logic, for example to add an OAUTH token to every Github API request, but not to the other requests:

If you want to learn more about this API and Angular in general, you can check out our ebook, online training (Pro Pack) and training!

Выполнения HTTP-запросов с помощью IHttpClientFactory в ASP.NET Core Make HTTP requests using IHttpClientFactory in ASP.NET Core

IHttpClientFactory можно зарегистрировать и использовать для настройки и создания экземпляров HttpClient в приложении. An IHttpClientFactory can be registered and used to configure and create HttpClient instances in an app. IHttpClientFactory предоставляет следующие преимущества: IHttpClientFactory offers the following benefits:

  • Центральное расположение для именования и настройки логических экземпляров HttpClient . Provides a central location for naming and configuring logical HttpClient instances. Например, можно зарегистрировать и настроить клиент github для доступа к GitHub. For example, a client named github could be registered and configured to access GitHub. Можно зарегистрировать клиент по умолчанию для общего доступа. A default client can be registered for general access.
  • Кодификация концепции исходящего ПО промежуточного слоя путем делегирования обработчиков в HttpClient . Codifies the concept of outgoing middleware via delegating handlers in HttpClient . Предоставление расширений для ПО промежуточного слоя на основе Polly для делегирования обработчиков в HttpClient . Provides extensions for Polly-based middleware to take advantage of delegating handlers in HttpClient .
  • Управление созданием пулов и временем существования базовых экземпляров HttpClientMessageHandler . Manages the pooling and lifetime of underlying HttpClientMessageHandler instances. Автоматическое управление позволяет избежать обычных проблем со службой доменных имен (DNS), которые возникают при управлении временем существования HttpClient вручную. Automatic management avoids common DNS (Domain Name System) problems that occur when manually managing HttpClient lifetimes.
  • Настройка параметров ведения журнала (через ILogger ) для всех запросов, отправленных через клиентов, созданных фабрикой. Adds a configurable logging experience (via ILogger ) for all requests sent through clients created by the factory.

Пример кода в этой версии раздела использует System.Text.Json для десериализации содержимого JSON, возвращаемого в ответах HTTP. The sample code in this topic version uses System.Text.Json to deserialize JSON content returned in HTTP responses. Для примеров, использующих Json.NET и ReadAsAsync , воспользуйтесь средством выбора версии, чтобы выбрать версию 2.x этого раздела. For samples that use Json.NET and ReadAsAsync , use the version selector to select a 2.x version of this topic.

Принципы использования Consumption patterns

Существует несколько способов использования IHttpClientFactory в приложении: There are several ways IHttpClientFactory can be used in an app:

Оптимальный подход зависит от требований приложения. The best approach depends upon the app’s requirements.

Основное использование Basic usage

IHttpClientFactory можно зарегистрировать, вызвав AddHttpClient : IHttpClientFactory can be registered by calling AddHttpClient :

IHttpClientFactory можно запросить с помощью внедрения зависимостей (DI). An IHttpClientFactory can be requested using dependency injection (DI). Следующий код использует IHttpClientFactory для создания экземпляра HttpClient : The following code uses IHttpClientFactory to create an HttpClient instance:

Подобное использование IHttpClientFactory — это хороший способ рефакторинга имеющегося приложения. Using IHttpClientFactory like in the preceding example is a good way to refactor an existing app. Он не оказывает влияния на использование HttpClient . It has no impact on how HttpClient is used. Там, где в существующем приложении создаются экземпляры HttpClient , используйте вызовы к CreateClient. In places where HttpClient instances are created in an existing app, replace those occurrences with calls to CreateClient.

Именованные клиенты Named clients

Именованные клиенты являются хорошим выбором в следующих случаях: Named clients are a good choice when:

  • Приложение требует много отдельных использований HttpClient . The app requires many distinct uses of HttpClient .
  • Многие HttpClient имеют другую конфигурацию. Many HttpClient s have different configuration.

Конфигурацию для именованного клиента HttpClient можно указать во время регистрации в Startup.ConfigureServices : Configuration for a named HttpClient can be specified during registration in Startup.ConfigureServices :

В приведенном выше коде клиент регистрируется с: In the preceding code the client is configured with:

  • базовым адресом https://api.github.com/ ; The base address https://api.github.com/ .
  • двумя заголовками, необходимыми для работы с API GitHub. Two headers required to work with the GitHub API.

CreateClient CreateClient

При каждом вызове CreateClient: Each time CreateClient is called:

  • создается новый экземпляр HttpClient ; A new instance of HttpClient is created.
  • вызывается действие настройки. The configuration action is called.

Чтобы создать именованный клиент, передайте его имя в CreateClient : To create a named client, pass its name into CreateClient :

В приведенном выше коде в запросе не требуется указывать имя узла. In the preceding code, the request doesn’t need to specify a hostname. Достаточно передать только путь, так как используется базовый адрес, заданный для клиента. The code can pass just the path, since the base address configured for the client is used.

Типизированные клиенты Typed clients

Типизированные клиенты: Typed clients:

  • предоставляют те же возможности, что и именованные клиенты, без необходимости использовать строки в качестве ключей. Provide the same capabilities as named clients without the need to use strings as keys.
  • Это помогает IntelliSense и компилятору при использовании клиентов. Provides IntelliSense and compiler help when consuming clients.
  • Они предоставляют единое расположение для настройки и взаимодействия с конкретным клиентом HttpClient . Provide a single location to configure and interact with a particular HttpClient . Например, один типизированный клиент можно использовать: For example, a single typed client might be used:
    • для одной серверной конечной точки; For a single backend endpoint.
    • для инкапсуляции всей логики, связанной с конечной точкой. To encapsulate all logic dealing with the endpoint.
  • Поддерживаются работа с внедрением зависимостей и возможность вставки в нужное место в приложении. Work with DI and can be injected where required in the app.

Типизированный клиент принимает параметр HttpClient в конструкторе: A typed client accepts a HttpClient parameter in its constructor:

В приведенном выше коде: In the preceding code:

  • Конфигурация перемещается в типизированный клиент. The configuration is moved into the typed client.
  • Объект HttpClient предоставляется в виде открытого свойства. The HttpClient object is exposed as a public property.

Можно создать связанные с API методы, которые предоставляют функциональные возможности HttpClient . API-specific methods can be created that expose HttpClient functionality. Например, метод GetAspNetDocsIssues инкапсулирует код для получения открытых вопросов. For example, the GetAspNetDocsIssues method encapsulates code to retrieve open issues.

Следующий код вызывает AddHttpClient в Startup.ConfigureServices для регистрации класса типизированного клиента: The following code calls AddHttpClient in Startup.ConfigureServices to register a typed client class:

Типизированный клиент регистрируется во внедрении зависимостей как временный. The typed client is registered as transient with DI. Типизированный клиент можно внедрить и использовать напрямую: The typed client can be injected and consumed directly:

Конфигурацию для типизированного клиента можно указать во время регистрации в Startup.ConfigureServices , а не в конструкторе типизированного клиента: The configuration for a typed client can be specified during registration in Startup.ConfigureServices , rather than in the typed client’s constructor:

HttpClient может быть инкапсулирован в типизированном клиенте. The HttpClient can be encapsulated within a typed client. Вместо предоставления его как свойства определите метод для внутреннего вызова экземпляра HttpClient : Rather than exposing it as a property, define a method which calls the HttpClient instance internally:

В приведенном выше коде HttpClient хранится в закрытом поле. In the preceding code, the HttpClient is stored in a private field. Доступ к HttpClient осуществляется с помощью общедоступного метода GetRepos . Access to the HttpClient is by the public GetRepos method.

Созданные клиенты Generated clients

IHttpClientFactory можно использовать в сочетании с библиотеками сторонних разработчиков, например Refit. IHttpClientFactory can be used in combination with third-party libraries such as Refit. Refit — это библиотека REST для .NET. Refit is a REST library for .NET. Она преобразует REST API в динамические интерфейсы. It converts REST APIs into live interfaces. Реализация интерфейса формируется динамически с помощью RestService с использованием HttpClient для совершения внешних вызовов HTTP. An implementation of the interface is generated dynamically by the RestService , using HttpClient to make the external HTTP calls.

Для представления внешнего API и его ответа определяются интерфейс и ответ: An interface and a reply are defined to represent the external API and its response:

Можно добавить типизированный клиент, используя Refit для создания реализации: A typed client can be added, using Refit to generate the implementation:

При необходимости можно использовать определенный интерфейс с реализацией, предоставленной внедрением зависимостей и Refit: The defined interface can be consumed where necessary, with the implementation provided by DI and Refit:

ПО промежуточного слоя для исходящих запросов Outgoing request middleware

В HttpClient существует концепция делегирования обработчиков, которые можно связать друг с другом для исходящих HTTP-запросов. HttpClient has the concept of delegating handlers that can be linked together for outgoing HTTP requests. IHttpClientFactory . IHttpClientFactory :

Упрощает определение обработчиков для применения к каждому именованному клиенту. Simplifies defining the handlers to apply for each named client.

Поддерживает регистрацию и объединение в цепочки нескольких обработчиков для создания конвейера ПО промежуточного слоя для исходящих запросов. Supports registration and chaining of multiple handlers to build an outgoing request middleware pipeline. Каждый из этих обработчиков может выполнять работу до и после исходящего запроса. Each of these handlers is able to perform work before and after the outgoing request. Этот шаблон: This pattern:

похож на входящий конвейер ПО промежуточного слоя в ASP.NET Core; Is similar to the inbound middleware pipeline in ASP.NET Core.

предоставляет механизм управления сквозной функциональностью HTTP-запросов, включая: Provides a mechanism to manage cross-cutting concerns around HTTP requests, such as:

  • кэширование caching
  • обработку ошибок error handling
  • сериализацию serialization
  • Ведение журналов logging

Чтобы создать делегированный обработчик, сделайте следующее: To create a delegating handler:

  • Создайте объект, производный от DelegatingHandler. Derive from DelegatingHandler.
  • Переопределите метод SendAsync. Override SendAsync. Выполните код до передачи запроса следующему обработчику в конвейере: Execute code before passing the request to the next handler in the pipeline:

Предыдущий код проверяет, находится ли заголовок X-API-KEY в запросе. The preceding code checks if the X-API-KEY header is in the request. Если X-API-KEY отсутствует, возвращается BadRequest. If X-API-KEY is missing, BadRequest is returned.

Можно добавить сразу несколько обработчиков в конфигурацию для HttpClient с использованием Microsoft.Extensions.DependencyInjection.HttpClientBuilderExtensions.AddHttpMessageHandler: More than one handler can be added to the configuration for a HttpClient with Microsoft.Extensions.DependencyInjection.HttpClientBuilderExtensions.AddHttpMessageHandler:

В приведенном выше коде ValidateHeaderHandler регистрируется с помощью внедрения зависимостей. In the preceding code, the ValidateHeaderHandler is registered with DI. IHttpClientFactory создает отдельную область внедрения зависимостей для каждого обработчика. The IHttpClientFactory creates a separate DI scope for each handler. Обработчики могут зависеть от служб из любой области. Handlers can depend upon services of any scope. Службы, которые зависят от обработчиков, удаляются при удалении обработчика. Services that handlers depend upon are disposed when the handler is disposed.

После регистрации можно вызвать AddHttpMessageHandler, передав тип обработчика. Once registered, AddHttpMessageHandler can be called, passing in the type for the handler.

Можно зарегистрировать несколько обработчиков в порядке, в котором они должны выполняться. Multiple handlers can be registered in the order that they should execute. Каждый обработчик содержит следующий обработчик, пока последний HttpClientHandler не выполнит запрос: Each handler wraps the next handler until the final HttpClientHandler executes the request:

Используйте один из следующих методов для предоставления общего доступа к состоянию отдельных запросов с помощью обработчиков сообщений: Use one of the following approaches to share per-request state with message handlers:

  • Передайте данные в обработчик с помощью HttpRequestMessage.Properties. Pass data into the handler using HttpRequestMessage.Properties.
  • Используйте IHttpContextAccessor для доступа к текущему запросу. Use IHttpContextAccessor to access the current request.
  • Создайте пользовательский объект хранилища AsyncLocal для передачи данных. Create a custom AsyncLocal storage object to pass the data.

Использование обработчиков на основе Polly Use Polly-based handlers

IHttpClientFactory интегрируется с библиотекой сторонних разработчиков Polly. IHttpClientFactory integrates with the third-party library Polly. Polly — это комплексная библиотека, обеспечивающая отказоустойчивость и обработку временных сбоев в .NET. Polly is a comprehensive resilience and transient fault-handling library for .NET. Она позволяет разработчикам выражать политики, например политику повтора, размыкателя цепи, времени ожидания, изоляции отсеков и отката, более эффективным и потокобезопасным образом. It allows developers to express policies such as Retry, Circuit Breaker, Timeout, Bulkhead Isolation, and Fallback in a fluent and thread-safe manner.

Для использования политик Polly с настроенными экземплярами HttpClient предоставляются методы расширения. Extension methods are provided to enable the use of Polly policies with configured HttpClient instances. Расширения Polly поддерживают добавление обработчиков на основе Polly клиентам. The Polly extensions support adding Polly-based handlers to clients. Polly нужен пакет NuGet Microsoft.Extensions.Http.Polly. Polly requires the Microsoft.Extensions.Http.Polly NuGet package.

Обработка временных сбоев Handle transient faults

Чаще всего ошибки происходят, когда внешние вызовы HTTP являются временными. Faults typically occur when external HTTP calls are transient. AddTransientHttpErrorPolicy позволяет определить политику для обработки временных ошибок. AddTransientHttpErrorPolicy allows a policy to be defined to handle transient errors. Политики, настроенные с помощью AddTransientHttpErrorPolicy , обрабатывают следующие ответы: Policies configured with AddTransientHttpErrorPolicy handle the following responses:

AddTransientHttpErrorPolicy предоставляет доступ к объекту PolicyBuilder , настроенному для обработки ошибок, представляющих возможный временный сбой: AddTransientHttpErrorPolicy provides access to a PolicyBuilder object configured to handle errors representing a possible transient fault:

В приведенном выше коде определена политика WaitAndRetryAsync . In the preceding code, a WaitAndRetryAsync policy is defined. Неудачные запросы повторяются до трех раз с задержкой 600 мс между попытками. Failed requests are retried up to three times with a delay of 600 ms between attempts.

Динамический выбор политик Dynamically select policies

Предоставляются методы расширения для добавления обработчиков на основе Polly, например AddPolicyHandler. Extension methods are provided to add Polly-based handlers, for example, AddPolicyHandler. Следующая перегрузка AddPolicyHandler проверяет запрос для определения применимой политики: The following AddPolicyHandler overload inspects the request to decide which policy to apply:

Если в приведенном выше коде исходящий запрос является запросом HTTP GET, применяется время ожидания 10 секунд. In the preceding code, if the outgoing request is an HTTP GET, a 10-second timeout is applied. Для остальных методов HTTP время ожидания — 30 секунд. For any other HTTP method, a 30-second timeout is used.

Добавление нескольких обработчиков Polly Add multiple Polly handlers

Общепринятой практикой является вложение политик Polly: It’s common to nest Polly policies:

В предшествующем примере: In the preceding example:

  • Добавляются два обработчика. Two handlers are added.
  • Первый обработчик использует AddTransientHttpErrorPolicy, чтобы добавить политику повтора. The first handler uses AddTransientHttpErrorPolicy to add a retry policy. Неудачные запросы выполняются повторно до трех раз. Failed requests are retried up to three times.
  • Второй вызов AddTransientHttpErrorPolicy добавляет политику размыкателя цепи. The second AddTransientHttpErrorPolicy call adds a circuit breaker policy. Дополнительные внешние запросы блокируются в течение 30 секунд в случае пяти неудачных попыток подряд. Further external requests are blocked for 30 seconds if 5 failed attempts occur sequentially. Политики размыкателя цепи отслеживают состояние. Circuit breaker policies are stateful. Все вызовы через этот клиент имеют одинаковое состояние цепи. All calls through this client share the same circuit state.

Добавление политик из реестра Polly Add policies from the Polly registry

Подход к управлению регулярно используемыми политиками заключается в их однократном определении и регистрации с помощью PolicyRegistry . An approach to managing regularly used policies is to define them once and register them with a PolicyRegistry .

В приведенном ниже коде выполняется следующее: In the following code:

  • Добавляются политики regular и long. The «regular» and «long» polices are added.
  • AddPolicyHandlerFromRegistry добавляет политики regular и long из реестра. AddPolicyHandlerFromRegistry adds the «regular» and «long» policies from the registry.

Дополнительные сведения о IHttpClientFactory и интеграции Polly см. на вики-сайте Polly. For more information on IHttpClientFactory and Polly integrations, see the Polly wiki.

Управление HttpClient и временем существования HttpClient and lifetime management

При каждом вызове CreateClient в IHttpClientFactory возвращается новый экземпляр HttpClient . A new HttpClient instance is returned each time CreateClient is called on the IHttpClientFactory . HttpMessageHandler создается для каждого именованного клиента. An HttpMessageHandler is created per named client. Фабрика обеспечивает управление временем существования экземпляров HttpMessageHandler . The factory manages the lifetimes of the HttpMessageHandler instances.

IHttpClientFactory объединяет в пул все экземпляры HttpMessageHandler , созданные фабрикой, чтобы уменьшить потребление ресурсов. IHttpClientFactory pools the HttpMessageHandler instances created by the factory to reduce resource consumption. Экземпляр HttpMessageHandler можно использовать повторно из пула при создании экземпляра HttpClient , если его время существования еще не истекло. An HttpMessageHandler instance may be reused from the pool when creating a new HttpClient instance if its lifetime hasn’t expired.

Создавать пулы обработчиков желательно, так как каждый обработчик обычно управляет собственными базовыми HTTP-подключениями. Pooling of handlers is desirable as each handler typically manages its own underlying HTTP connections. Создание лишних обработчиков может привести к задержке подключения. Creating more handlers than necessary can result in connection delays. Некоторые обработчики поддерживают подключения открытыми в течение неопределенного периода, что может помешать обработчику отреагировать на изменения службы доменных имен (DNS). Some handlers also keep connections open indefinitely, which can prevent the handler from reacting to DNS (Domain Name System) changes.

Время существования обработчика по умолчанию — две минуты. The default handler lifetime is two minutes. Значение по умолчанию можно переопределить для каждого именованного клиента: The default value can be overridden on a per named client basis:

Экземпляры HttpClient обычно можно рассматривать как объекты .NET, не требующие освобождения. HttpClient instances can generally be treated as .NET objects not requiring disposal. Высвобождение отменяет исходящие запросы и гарантирует, что указанный экземпляр HttpClient не может использоваться после вызова Dispose. Disposal cancels outgoing requests and guarantees the given HttpClient instance can’t be used after calling Dispose. IHttpClientFactory отслеживает и высвобождает ресурсы, используемые экземплярами HttpClient . IHttpClientFactory tracks and disposes resources used by HttpClient instances.

До появления IHttpClientFactory один экземпляр HttpClient часто сохраняли в активном состоянии в течение длительного времени. Keeping a single HttpClient instance alive for a long duration is a common pattern used before the inception of IHttpClientFactory . После перехода на IHttpClientFactory это уже не нужно. This pattern becomes unnecessary after migrating to IHttpClientFactory .

Ведение журнала Logging

Клиенты, созданные через IHttpClientFactory , записывают сообщения журнала для всех запросов. Clients created via IHttpClientFactory record log messages for all requests. Установите соответствующий уровень информации в конфигурации ведения журнала, чтобы просматривать сообщения журнала по умолчанию. Enable the appropriate information level in the logging configuration to see the default log messages. Дополнительное ведение журнала, например запись заголовков запросов, включено только на уровне трассировки. Additional logging, such as the logging of request headers, is only included at trace level.

Категория журнала для каждого клиента включает в себя имя клиента. The log category used for each client includes the name of the client. Клиент с именем MyNamedClient, например, записывает в журнал сообщения с категорией «System.Net.Http.HttpClient.MyNamedClient.LogicalHandler». A client named MyNamedClient, for example, logs messages with a category of «System.Net.Http.HttpClient.MyNamedClient.LogicalHandler». Сообщения с суффиксом LogicalHandler создаются за пределами конвейера обработчиков запросов. Messages suffixed with LogicalHandler occur outside the request handler pipeline. Во время запроса сообщения записываются в журнал до обработки запроса другими обработчиками в конвейере. On the request, messages are logged before any other handlers in the pipeline have processed it. Во время ответа сообщения записываются в журнал после получения ответа другими обработчиками в конвейере. On the response, messages are logged after any other pipeline handlers have received the response.

Кроме того, журнал ведется в конвейере обработчиков запросов. Logging also occurs inside the request handler pipeline. В примере MyNamedClient эти сообщения регистрируются с категорией журнала «System.Net.Http.HttpClient.MyNamedClient.ClientHandler». In the MyNamedClient example, those messages are logged with the log category «System.Net.Http.HttpClient.MyNamedClient.ClientHandler». Во время запроса это происходит после выполнения всех обработчиков и непосредственно перед отправкой запроса. For the request, this occurs after all other handlers have run and immediately before the request is sent. Во время ответа в журнале записывается состояние ответа перед его передачей обратно по конвейеру обработчиков. On the response, this logging includes the state of the response before it passes back through the handler pipeline.

Включив ведение журнала в конвейере и за его пределами, можно выполнять проверку изменений, внесенных другими обработчиками конвейера. Enabling logging outside and inside the pipeline enables inspection of the changes made by the other pipeline handlers. Сюда входят изменения заголовков запросов или кода состояния ответов. This may include changes to request headers or to the response status code.

Включение имени клиента в категорию журнала позволяет фильтровать журналы по именованным клиентам. Including the name of the client in the log category enables log filtering for specific named clients.

Настройка HttpMessageHandler Configure the HttpMessageHandler

Иногда необходимо контролировать конфигурацию внутреннего обработчика HttpMessageHandler , используемого клиентом. It may be necessary to control the configuration of the inner HttpMessageHandler used by a client.

При добавлении именованного или типизированного клиента возвращается IHttpClientBuilder . An IHttpClientBuilder is returned when adding named or typed clients. Для определения делегата можно использовать метод расширения ConfigurePrimaryHttpMessageHandler. The ConfigurePrimaryHttpMessageHandler extension method can be used to define a delegate. Делегат используется для создания и настройки основного обработчика HttpMessageHandler , используемого этим клиентом: The delegate is used to create and configure the primary HttpMessageHandler used by that client:

Использование IHttpClientFactory в консольном приложении Use IHttpClientFactory in a console app

В консольном приложении добавьте в проект следующие ссылки на пакеты: In a console app, add the following package references to the project:

В следующем примере: In the following example:

  • IHttpClientFactory регистрируется в контейнере службы универсального узла: IHttpClientFactory is registered in the Generic Host’s service container.
  • MyService создает экземпляр фабрики клиента из службы, который используется для создания HttpClient . MyService creates a client factory instance from the service, which is used to create an HttpClient . HttpClient используется для получения веб-страницы. HttpClient is used to retrieve a webpage.
  • Main создает область для выполнения метода GetPage службы и вывода первых 500 символов содержимого веб-страницы на консоль. Main creates a scope to execute the service’s GetPage method and write the first 500 characters of the webpage content to the console.

Дополнительные ресурсы Additional resources


IHttpClientFactory можно зарегистрировать и использовать для настройки и создания экземпляров HttpClient в приложении. An IHttpClientFactory can be registered and used to configure and create HttpClient instances in an app. Так вы получите следующие преимущества: It offers the following benefits:

  • Центральное расположение для именования и настройки логических экземпляров HttpClient . Provides a central location for naming and configuring logical HttpClient instances. Например, можно зарегистрировать и настроить клиент github для доступа к GitHub. For example, a github client can be registered and configured to access GitHub. Можно зарегистрировать клиент по умолчанию для других целей. A default client can be registered for other purposes.
  • Кодификация концепции исходящего ПО промежуточного слоя путем делегирования обработчиков в HttpClient и предоставление расширений для ПО промежуточного слоя на основе Polly для использования этой возможности. Codifies the concept of outgoing middleware via delegating handlers in HttpClient and provides extensions for Polly-based middleware to take advantage of that.
  • Управление созданием пулов и временем существования базовых экземпляров HttpClientMessageHandler с целью избежать обычных проблем с DNS, которые возникают при управлении временем существования HttpClient вручную. Manages the pooling and lifetime of underlying HttpClientMessageHandler instances to avoid common DNS problems that occur when manually managing HttpClient lifetimes.
  • Настройка параметров ведения журнала (через ILogger ) для всех запросов, отправленных через клиентов, созданных фабрикой. Adds a configurable logging experience (via ILogger ) for all requests sent through clients created by the factory.

Принципы использования Consumption patterns

Существует несколько способов использования IHttpClientFactory в приложении: There are several ways IHttpClientFactory can be used in an app:

Все способы равноценны. None of them are strictly superior to another. Оптимальный подход зависит от ограничений приложения. The best approach depends upon the app’s constraints.

Основное использование Basic usage

IHttpClientFactory можно зарегистрировать путем вызова метода расширения AddHttpClient в IServiceCollection внутри метода Startup.ConfigureServices . The IHttpClientFactory can be registered by calling the AddHttpClient extension method on the IServiceCollection , inside the Startup.ConfigureServices method.

После регистрации код может принимать IHttpClientFactory в любом месте, куда можно внедрить службу с помощью внедрения зависимостей (DI). Once registered, code can accept an IHttpClientFactory anywhere services can be injected with dependency injection (DI). IHttpClientFactory можно использовать для создания экземпляра HttpClient : The IHttpClientFactory can be used to create a HttpClient instance:

Подобное использование IHttpClientFactory — это отличный способ рефакторинга имеющегося приложения. Using IHttpClientFactory in this fashion is a good way to refactor an existing app. Он не оказывает влияния на использование HttpClient . It has no impact on the way HttpClient is used. Там, где в данный момент создаются экземпляры HttpClient , используйте вызов к CreateClient. In places where HttpClient instances are currently created, replace those occurrences with a call to CreateClient.

Именованные клиенты Named clients

Если для приложения предполагаются разные способы использования HttpClient , каждый со своей конфигурацией, можно применять именованные клиенты. If an app requires many distinct uses of HttpClient , each with a different configuration, an option is to use named clients. Конфигурацию для именованного клиента HttpClient можно указать во время регистрации в Startup.ConfigureServices . Configuration for a named HttpClient can be specified during registration in Startup.ConfigureServices .

В приведенном выше коде вызывается клиент AddHttpClient , предоставляющий имя github. In the preceding code, AddHttpClient is called, providing the name github. У клиента есть некоторые настройки по умолчанию — а именно: базовый адрес и два заголовка, необходимые для работы с API GitHub. This client has some default configuration applied—namely the base address and two headers required to work with the GitHub API.

При каждом вызове CreateClient создается новый экземпляр HttpClient и вызывается действие конфигурации. Each time CreateClient is called, a new instance of HttpClient is created and the configuration action is called.

Для использования именованного клиента можно передать строковый параметр в CreateClient . To consume a named client, a string parameter can be passed to CreateClient . Укажите имя создаваемого клиента: Specify the name of the client to be created:

В приведенном выше коде в запросе не требуется указывать имя узла. In the preceding code, the request doesn’t need to specify a hostname. Достаточно передать только путь, так как используется базовый адрес, заданный для клиента. It can pass just the path, since the base address configured for the client is used.

Типизированные клиенты Typed clients

Типизированные клиенты: Typed clients:

  • предоставляют те же возможности, что и именованные клиенты, без необходимости использовать строки в качестве ключей. Provide the same capabilities as named clients without the need to use strings as keys.
  • Это помогает IntelliSense и компилятору при использовании клиентов. Provides IntelliSense and compiler help when consuming clients.
  • Они предоставляют единое расположение для настройки и взаимодействия с конкретным клиентом HttpClient . Provide a single location to configure and interact with a particular HttpClient . Например, для конечной точки серверной части можно использовать один типизированный клиент, который будет содержать всю логику работы с этой конечной точкой. For example, a single typed client might be used for a single backend endpoint and encapsulate all logic dealing with that endpoint.
  • Поддерживаются работа с внедрением зависимостей и возможность вставки в нужное место в приложении. Work with DI and can be injected where required in your app.

Типизированный клиент принимает параметр HttpClient в конструкторе: A typed client accepts a HttpClient parameter in its constructor:

В приведенном выше коде конфигурация перемещается в типизированный клиент. In the preceding code, the configuration is moved into the typed client. Объект HttpClient предоставляется в виде открытого свойства. The HttpClient object is exposed as a public property. Можно определить связанные с API методы, которые предоставляют функциональные возможности HttpClient . It’s possible to define API-specific methods that expose HttpClient functionality. Метод GetAspNetDocsIssues инкапсулирует код, необходимый для запроса и анализа последнего открытого выпуска из репозитория GitHub. The GetAspNetDocsIssues method encapsulates the code needed to query for and parse out the latest open issues from a GitHub repository.

Для регистрации типизированного клиента можно использовать универсальный метод расширения AddHttpClient в Startup.ConfigureServices , указав класс типизированного клиента: To register a typed client, the generic AddHttpClient extension method can be used within Startup.ConfigureServices , specifying the typed client class:

Типизированный клиент регистрируется во внедрении зависимостей как временный. The typed client is registered as transient with DI. Типизированный клиент можно внедрить и использовать напрямую: The typed client can be injected and consumed directly:

При желании конфигурацию для типизированного клиента можно указать во время регистрации в Startup.ConfigureServices , а не в конструкторе типизированного клиента: If preferred, the configuration for a typed client can be specified during registration in Startup.ConfigureServices , rather than in the typed client’s constructor:

Можно полностью инкапсулировать HttpClient внутри типизированного клиента. It’s possible to entirely encapsulate the HttpClient within a typed client. Вместо предоставления его как свойства можно использовать открытые методы для внутреннего вызова экземпляра HttpClient . Rather than exposing it as a property, public methods can be provided which call the HttpClient instance internally.

В приведенном выше коде HttpClient хранится как закрытое поле. In the preceding code, the HttpClient is stored as a private field. Любой доступ для совершения внешних вызовов осуществляется через метод GetRepos . All access to make external calls goes through the GetRepos method.

Созданные клиенты Generated clients

IHttpClientFactory можно использовать в сочетании с другими библиотеками сторонних разработчиков, например Refit. IHttpClientFactory can be used in combination with other third-party libraries such as Refit. Refit — это библиотека REST для .NET. Refit is a REST library for .NET. Она преобразует REST API в динамические интерфейсы. It converts REST APIs into live interfaces. Реализация интерфейса формируется динамически с помощью RestService с использованием HttpClient для совершения внешних вызовов HTTP. An implementation of the interface is generated dynamically by the RestService , using HttpClient to make the external HTTP calls.

Для представления внешнего API и его ответа определяются интерфейс и ответ: An interface and a reply are defined to represent the external API and its response:

Можно добавить типизированный клиент, используя Refit для создания реализации: A typed client can be added, using Refit to generate the implementation:

При необходимости можно использовать определенный интерфейс с реализацией, предоставленной внедрением зависимостей и Refit: The defined interface can be consumed where necessary, with the implementation provided by DI and Refit:

ПО промежуточного слоя для исходящих запросов Outgoing request middleware

В HttpClient уже существует концепция делегирования обработчиков, которые можно связать друг с другом для исходящих HTTP-запросов. HttpClient already has the concept of delegating handlers that can be linked together for outgoing HTTP requests. Класс IHttpClientFactory упрощает определение обработчиков для применения к каждому именованному клиенту. The IHttpClientFactory makes it easy to define the handlers to apply for each named client. Он поддерживает регистрацию и объединение в цепочки нескольких обработчиков для создания конвейера ПО промежуточного слоя для исходящих запросов. It supports registration and chaining of multiple handlers to build an outgoing request middleware pipeline. Каждый из этих обработчиков может выполнять работу до и после исходящего запроса. Each of these handlers is able to perform work before and after the outgoing request. Этот шаблон похож на входящий конвейер ПО промежуточного слоя в ASP.NET Core. This pattern is similar to the inbound middleware pipeline in ASP.NET Core. Шаблон предоставляет механизм управления сквозной функциональностью HTTP-запросов, включая кэширование, обработку ошибок, сериализацию и ведение журнала. The pattern provides a mechanism to manage cross-cutting concerns around HTTP requests, including caching, error handling, serialization, and logging.

Чтобы создать обработчик, необходимо определить класс, производный от DelegatingHandler. To create a handler, define a class deriving from DelegatingHandler. Переопределите метод SendAsync для выполнения кода до передачи запросов следующему обработчику в конвейере: Override the SendAsync method to execute code before passing the request to the next handler in the pipeline:

В предыдущем коде определяется базовый обработчик. The preceding code defines a basic handler. Он проверяет, включен ли в запрос заголовок X-API-KEY . It checks to see if an X-API-KEY header has been included on the request. Если заголовок отсутствует, он может избежать вызовов HTTP и вернуть подходящий ответ. If the header is missing, it can avoid the HTTP call and return a suitable response.

Во время регистрации можно добавить один или несколько обработчиков в конфигурацию для HttpClient . During registration, one or more handlers can be added to the configuration for a HttpClient . Эта задача выполняется через методы расширения в IHttpClientBuilder. This task is accomplished via extension methods on the IHttpClientBuilder.

В приведенном выше коде ValidateHeaderHandler регистрируется с помощью внедрения зависимостей. In the preceding code, the ValidateHeaderHandler is registered with DI. IHttpClientFactory создает отдельную область внедрения зависимостей для каждого обработчика. The IHttpClientFactory creates a separate DI scope for each handler. Обработчики могут зависеть от служб из любой области. Handlers are free to depend upon services of any scope. Службы, которые зависят от обработчиков, удаляются при удалении обработчика. Services that handlers depend upon are disposed when the handler is disposed.

После регистрации можно вызвать AddHttpMessageHandler, передав тип обработчика. Once registered, AddHttpMessageHandler can be called, passing in the type for the handler.

Можно зарегистрировать несколько обработчиков в порядке, в котором они должны выполняться. Multiple handlers can be registered in the order that they should execute. Каждый обработчик содержит следующий обработчик, пока последний HttpClientHandler не выполнит запрос: Each handler wraps the next handler until the final HttpClientHandler executes the request:

Используйте один из следующих методов для предоставления общего доступа к состоянию отдельных запросов с помощью обработчиков сообщений: Use one of the following approaches to share per-request state with message handlers:

  • Передайте данные в обработчик с помощью HttpRequestMessage.Properties . Pass data into the handler using HttpRequestMessage.Properties .
  • Используйте IHttpContextAccessor для доступа к текущему запросу. Use IHttpContextAccessor to access the current request.
  • Создайте пользовательский объект хранилища AsyncLocal для передачи данных. Create a custom AsyncLocal storage object to pass the data.

Использование обработчиков на основе Polly Use Polly-based handlers

IHttpClientFactory интегрируется с популярной библиотекой сторонних разработчиков под названием Polly. IHttpClientFactory integrates with a popular third-party library called Polly. Polly — это комплексная библиотека, обеспечивающая отказоустойчивость и обработку временных сбоев в .NET. Polly is a comprehensive resilience and transient fault-handling library for .NET. Она позволяет разработчикам выражать политики, например политику повтора, размыкателя цепи, времени ожидания, изоляции отсеков и отката, более эффективным и потокобезопасным образом. It allows developers to express policies such as Retry, Circuit Breaker, Timeout, Bulkhead Isolation, and Fallback in a fluent and thread-safe manner.

Для использования политик Polly с настроенными экземплярами HttpClient предоставляются методы расширения. Extension methods are provided to enable the use of Polly policies with configured HttpClient instances. Расширения Polly: The Polly extensions:

  • Поддерживает добавление обработчиков на основе Polly клиентам. Support adding Polly-based handlers to clients.
  • Можно использовать после установки пакета NuGet Microsoft.Extensions.Http.Polly. Can be used after installing the Microsoft.Extensions.Http.Polly NuGet package. Пакет не включен в общую платформу ASP.NET Core. The package isn’t included in the ASP.NET Core shared framework.

Обработка временных сбоев Handle transient faults

Чаще всего ошибки происходят, когда внешние вызовы HTTP являются временными. Most common faults occur when external HTTP calls are transient. Используется удобный метод расширения AddTransientHttpErrorPolicy , который позволяет определить политику для обработки временных ошибок. A convenient extension method called AddTransientHttpErrorPolicy is included which allows a policy to be defined to handle transient errors. Политики, заданные с помощью этого метода расширения, обрабатывают HttpRequestException , ответы HTTP 5xx и ответы HTTP 408. Policies configured with this extension method handle HttpRequestException , HTTP 5xx responses, and HTTP 408 responses.

Расширение AddTransientHttpErrorPolicy может быть использовано в Startup.ConfigureServices . The AddTransientHttpErrorPolicy extension can be used within Startup.ConfigureServices . Данное расширение предоставляет доступ к объекту PolicyBuilder , настроенному для обработки ошибок, представляющих возможный временный сбой: The extension provides access to a PolicyBuilder object configured to handle errors representing a possible transient fault:

В приведенном выше коде определена политика WaitAndRetryAsync . In the preceding code, a WaitAndRetryAsync policy is defined. Неудачные запросы повторяются до трех раз с задержкой 600 мс между попытками. Failed requests are retried up to three times with a delay of 600 ms between attempts.

Динамический выбор политик Dynamically select policies

Существуют дополнительные методы расширения, которые можно использовать для добавления обработчиков на основе Polly. Additional extension methods exist which can be used to add Polly-based handlers. Одним из таких расширений является AddPolicyHandler с несколькими перегрузками. One such extension is AddPolicyHandler , which has multiple overloads. Одна перегрузка разрешает проверку запроса для определения необходимой политики: One overload allows the request to be inspected when defining which policy to apply:

Если в приведенном выше коде исходящий запрос является запросом HTTP GET, применяется время ожидания 10 секунд. In the preceding code, if the outgoing request is an HTTP GET, a 10-second timeout is applied. Для остальных методов HTTP время ожидания — 30 секунд. For any other HTTP method, a 30-second timeout is used.

Добавление нескольких обработчиков Polly Add multiple Polly handlers

Общепринятой практикой является вложение политик Polly для предоставления расширенной функциональности: It’s common to nest Polly policies to provide enhanced functionality:

В приведенном выше примере добавляются два обработчика. In the preceding example, two handlers are added. Первый использует расширение AddTransientHttpErrorPolicy , чтобы добавить политику повтора. The first uses the AddTransientHttpErrorPolicy extension to add a retry policy. Неудачные запросы выполняются повторно до трех раз. Failed requests are retried up to three times. Второй вызов к AddTransientHttpErrorPolicy добавляет политику размыкателя цепи. The second call to AddTransientHttpErrorPolicy adds a circuit breaker policy. Дополнительные внешние запросы блокируются в течение 30 секунд в случае пяти неудачных попыток подряд. Further external requests are blocked for 30 seconds if five failed attempts occur sequentially. Политики размыкателя цепи отслеживают состояние. Circuit breaker policies are stateful. Все вызовы через этот клиент имеют одинаковое состояние цепи. All calls through this client share the same circuit state.

Добавление политик из реестра Polly Add policies from the Polly registry

Подход к управлению регулярно используемыми политиками заключается в их однократном определении и регистрации с помощью PolicyRegistry . An approach to managing regularly used policies is to define them once and register them with a PolicyRegistry . Предоставляется метод расширения, разрешающий добавление обработчика с помощью политики из реестра: An extension method is provided which allows a handler to be added using a policy from the registry:

В приведенном выше коде, когда PolicyRegistry добавляется в ServiceCollection , регистрируются две политики. In the preceding code, two policies are registered when the PolicyRegistry is added to the ServiceCollection . Чтобы использовать политику из реестра, применяется метод AddPolicyHandlerFromRegistry , который передает имя необходимой политики. To use a policy from the registry, the AddPolicyHandlerFromRegistry method is used, passing the name of the policy to apply.

Дополнительные сведения об интеграции IHttpClientFactory и Polly см. на вики-сайте Polly. Further information about IHttpClientFactory and Polly integrations can be found on the Polly wiki.

Управление HttpClient и временем существования HttpClient and lifetime management

При каждом вызове CreateClient в IHttpClientFactory возвращается новый экземпляр HttpClient . A new HttpClient instance is returned each time CreateClient is called on the IHttpClientFactory . Для каждого названного клиента существует HttpMessageHandler. There’s an HttpMessageHandler per named client. Фабрика обеспечивает управление временем существования экземпляров HttpMessageHandler . The factory manages the lifetimes of the HttpMessageHandler instances.

IHttpClientFactory объединяет в пул все экземпляры HttpMessageHandler , созданные фабрикой, чтобы уменьшить потребление ресурсов. IHttpClientFactory pools the HttpMessageHandler instances created by the factory to reduce resource consumption. Экземпляр HttpMessageHandler можно использовать повторно из пула при создании экземпляра HttpClient , если его время существования еще не истекло. An HttpMessageHandler instance may be reused from the pool when creating a new HttpClient instance if its lifetime hasn’t expired.

Создавать пулы обработчиков желательно, так как каждый обработчик обычно управляет собственными базовыми HTTP-подключениями. Pooling of handlers is desirable as each handler typically manages its own underlying HTTP connections. Создание лишних обработчиков может привести к задержке подключения. Creating more handlers than necessary can result in connection delays. Некоторые обработчики поддерживают подключения открытыми в течение неопределенного периода, что может помешать обработчику отреагировать на изменения DNS. Some handlers also keep connections open indefinitely, which can prevent the handler from reacting to DNS changes.

Время существования обработчика по умолчанию — две минуты. The default handler lifetime is two minutes. Значение по умолчанию можно переопределить для каждого именованного клиента. The default value can be overridden on a per named client basis. Чтобы переопределить это значение, вызовите SetHandlerLifetime в IHttpClientBuilder , который возвращается при создании клиента: To override it, call SetHandlerLifetime on the IHttpClientBuilder that is returned when creating the client:

Высвобождать клиент не требуется. Disposal of the client isn’t required. Высвобождение отменяет исходящие запросы и гарантирует, что указанный экземпляр HttpClient не может использоваться после вызова Dispose. Disposal cancels outgoing requests and guarantees the given HttpClient instance can’t be used after calling Dispose. IHttpClientFactory отслеживает и высвобождает ресурсы, используемые экземплярами HttpClient . IHttpClientFactory tracks and disposes resources used by HttpClient instances. Экземпляры HttpClient обычно можно рассматривать как объекты .NET, не требующие высвобождения. The HttpClient instances can generally be treated as .NET objects not requiring disposal.

До появления IHttpClientFactory один экземпляр HttpClient часто сохраняли в активном состоянии в течение длительного времени. Keeping a single HttpClient instance alive for a long duration is a common pattern used before the inception of IHttpClientFactory . После перехода на IHttpClientFactory это уже не нужно. This pattern becomes unnecessary after migrating to IHttpClientFactory .

Ведение журнала Logging

Клиенты, созданные через IHttpClientFactory , записывают сообщения журнала для всех запросов. Clients created via IHttpClientFactory record log messages for all requests. Установите соответствующий уровень информации в конфигурации ведения журнала, чтобы просматривать сообщения журнала по умолчанию. Enable the appropriate information level in your logging configuration to see the default log messages. Дополнительное ведение журнала, например запись заголовков запросов, включено только на уровне трассировки. Additional logging, such as the logging of request headers, is only included at trace level.

Категория журнала для каждого клиента включает в себя имя клиента. The log category used for each client includes the name of the client. Клиент с именем MyNamedClient, например, записывает в журнал сообщения с категорией System.Net.Http.HttpClient.MyNamedClient.LogicalHandler . A client named MyNamedClient, for example, logs messages with a category of System.Net.Http.HttpClient.MyNamedClient.LogicalHandler . Сообщения с суффиксом LogicalHandler создаются за пределами конвейера обработчиков запросов. Messages suffixed with LogicalHandler occur outside the request handler pipeline. Во время запроса сообщения записываются в журнал до обработки запроса другими обработчиками в конвейере. On the request, messages are logged before any other handlers in the pipeline have processed it. Во время ответа сообщения записываются в журнал после получения ответа другими обработчиками в конвейере. On the response, messages are logged after any other pipeline handlers have received the response.

Кроме того, журнал ведется в конвейере обработчиков запросов. Logging also occurs inside the request handler pipeline. В примере MyNamedClient эти сообщения вносятся в журнал по категории журнала System.Net.Http.HttpClient.MyNamedClient.ClientHandler . In the MyNamedClient example, those messages are logged against the log category System.Net.Http.HttpClient.MyNamedClient.ClientHandler . Во время запроса это происходит после выполнения всех обработчиков и непосредственно перед отправкой запроса по сети. For the request, this occurs after all other handlers have run and immediately before the request is sent out on the network. Во время ответа в журнале записывается состояние ответа перед его передачей обратно по конвейеру обработчиков. On the response, this logging includes the state of the response before it passes back through the handler pipeline.

Включив ведение журнала в конвейере и за его пределами, можно выполнять проверку изменений, внесенных другими обработчиками конвейера. Enabling logging outside and inside the pipeline enables inspection of the changes made by the other pipeline handlers. Сюда входят, например, изменения заголовков запросов или кода состояния ответов. This may include changes to request headers, for example, or to the response status code.

Включение имени клиента в категорию журнала позволяет фильтровать журналы по именованным клиентам при необходимости. Including the name of the client in the log category enables log filtering for specific named clients where necessary.

Настройка HttpMessageHandler Configure the HttpMessageHandler

Иногда необходимо контролировать конфигурацию внутреннего обработчика HttpMessageHandler , используемого клиентом. It may be necessary to control the configuration of the inner HttpMessageHandler used by a client.

При добавлении именованного или типизированного клиента возвращается IHttpClientBuilder . An IHttpClientBuilder is returned when adding named or typed clients. Для определения делегата можно использовать метод расширения ConfigurePrimaryHttpMessageHandler. The ConfigurePrimaryHttpMessageHandler extension method can be used to define a delegate. Делегат используется для создания и настройки основного обработчика HttpMessageHandler , используемого этим клиентом: The delegate is used to create and configure the primary HttpMessageHandler used by that client:

Использование IHttpClientFactory в консольном приложении Use IHttpClientFactory in a console app

В консольном приложении добавьте в проект следующие ссылки на пакеты: In a console app, add the following package references to the project:

В следующем примере: In the following example:

  • IHttpClientFactory регистрируется в контейнере службы универсального узла: IHttpClientFactory is registered in the Generic Host’s service container.
  • MyService создает экземпляр фабрики клиента из службы, который используется для создания HttpClient . MyService creates a client factory instance from the service, which is used to create an HttpClient . HttpClient используется для получения веб-страницы. HttpClient is used to retrieve a webpage.
  • Main создает область для выполнения метода GetPage службы и вывода первых 500 символов содержимого веб-страницы на консоль. Main creates a scope to execute the service’s GetPage method and write the first 500 characters of the webpage content to the console.

Дополнительные ресурсы Additional resources

IHttpClientFactory можно зарегистрировать и использовать для настройки и создания экземпляров HttpClient в приложении. An IHttpClientFactory can be registered and used to configure and create HttpClient instances in an app. Так вы получите следующие преимущества: It offers the following benefits:

  • Центральное расположение для именования и настройки логических экземпляров HttpClient . Provides a central location for naming and configuring logical HttpClient instances. Например, можно зарегистрировать и настроить клиент github для доступа к GitHub. For example, a github client can be registered and configured to access GitHub. Можно зарегистрировать клиент по умолчанию для других целей. A default client can be registered for other purposes.
  • Кодификация концепции исходящего ПО промежуточного слоя путем делегирования обработчиков в HttpClient и предоставление расширений для ПО промежуточного слоя на основе Polly для использования этой возможности. Codifies the concept of outgoing middleware via delegating handlers in HttpClient and provides extensions for Polly-based middleware to take advantage of that.
  • Управление созданием пулов и временем существования базовых экземпляров HttpClientMessageHandler с целью избежать обычных проблем с DNS, которые возникают при управлении временем существования HttpClient вручную. Manages the pooling and lifetime of underlying HttpClientMessageHandler instances to avoid common DNS problems that occur when manually managing HttpClient lifetimes.
  • Настройка параметров ведения журнала (через ILogger ) для всех запросов, отправленных через клиентов, созданных фабрикой. Adds a configurable logging experience (via ILogger ) for all requests sent through clients created by the factory.

Предварительные требования Prerequisites

Для проектов, предназначенных для .NET Framework, необходимо установить пакет NuGet Microsoft.Extensions.Http. Projects targeting .NET Framework require installation of the Microsoft.Extensions.Http NuGet package. Пакет Microsoft.Extensions.Http уже включен в проекты, предназначенные для .NET Core и ссылающиеся на метапакет Microsoft.AspNetCore.App. Projects that target .NET Core and reference the Microsoft.AspNetCore.App metapackage already include the Microsoft.Extensions.Http package.

Принципы использования Consumption patterns

Существует несколько способов использования IHttpClientFactory в приложении: There are several ways IHttpClientFactory can be used in an app:

Все способы равноценны. None of them are strictly superior to another. Оптимальный подход зависит от ограничений приложения. The best approach depends upon the app’s constraints.

Основное использование Basic usage

IHttpClientFactory можно зарегистрировать путем вызова метода расширения AddHttpClient в IServiceCollection внутри метода Startup.ConfigureServices . The IHttpClientFactory can be registered by calling the AddHttpClient extension method on the IServiceCollection , inside the Startup.ConfigureServices method.

После регистрации код может принимать IHttpClientFactory в любом месте, куда можно внедрить службу с помощью внедрения зависимостей (DI). Once registered, code can accept an IHttpClientFactory anywhere services can be injected with dependency injection (DI). IHttpClientFactory можно использовать для создания экземпляра HttpClient : The IHttpClientFactory can be used to create a HttpClient instance:

Подобное использование IHttpClientFactory — это отличный способ рефакторинга имеющегося приложения. Using IHttpClientFactory in this fashion is a good way to refactor an existing app. Он не оказывает влияния на использование HttpClient . It has no impact on the way HttpClient is used. Там, где в данный момент создаются экземпляры HttpClient , используйте вызов к CreateClient. In places where HttpClient instances are currently created, replace those occurrences with a call to CreateClient.

Именованные клиенты Named clients

Если для приложения предполагаются разные способы использования HttpClient , каждый со своей конфигурацией, можно применять именованные клиенты. If an app requires many distinct uses of HttpClient , each with a different configuration, an option is to use named clients. Конфигурацию для именованного клиента HttpClient можно указать во время регистрации в Startup.ConfigureServices . Configuration for a named HttpClient can be specified during registration in Startup.ConfigureServices .

В приведенном выше коде вызывается клиент AddHttpClient , предоставляющий имя github. In the preceding code, AddHttpClient is called, providing the name github. У клиента есть некоторые настройки по умолчанию — а именно: базовый адрес и два заголовка, необходимые для работы с API GitHub. This client has some default configuration applied—namely the base address and two headers required to work with the GitHub API.

При каждом вызове CreateClient создается новый экземпляр HttpClient и вызывается действие конфигурации. Each time CreateClient is called, a new instance of HttpClient is created and the configuration action is called.

Для использования именованного клиента можно передать строковый параметр в CreateClient . To consume a named client, a string parameter can be passed to CreateClient . Укажите имя создаваемого клиента: Specify the name of the client to be created:

В приведенном выше коде в запросе не требуется указывать имя узла. In the preceding code, the request doesn’t need to specify a hostname. Достаточно передать только путь, так как используется базовый адрес, заданный для клиента. It can pass just the path, since the base address configured for the client is used.

Типизированные клиенты Typed clients

Типизированные клиенты: Typed clients:

  • предоставляют те же возможности, что и именованные клиенты, без необходимости использовать строки в качестве ключей. Provide the same capabilities as named clients without the need to use strings as keys.
  • Это помогает IntelliSense и компилятору при использовании клиентов. Provides IntelliSense and compiler help when consuming clients.
  • Они предоставляют единое расположение для настройки и взаимодействия с конкретным клиентом HttpClient . Provide a single location to configure and interact with a particular HttpClient . Например, для конечной точки серверной части можно использовать один типизированный клиент, который будет содержать всю логику работы с этой конечной точкой. For example, a single typed client might be used for a single backend endpoint and encapsulate all logic dealing with that endpoint.
  • Поддерживаются работа с внедрением зависимостей и возможность вставки в нужное место в приложении. Work with DI and can be injected where required in your app.

Типизированный клиент принимает параметр HttpClient в конструкторе: A typed client accepts a HttpClient parameter in its constructor:

В приведенном выше коде конфигурация перемещается в типизированный клиент. In the preceding code, the configuration is moved into the typed client. Объект HttpClient предоставляется в виде открытого свойства. The HttpClient object is exposed as a public property. Можно определить связанные с API методы, которые предоставляют функциональные возможности HttpClient . It’s possible to define API-specific methods that expose HttpClient functionality. Метод GetAspNetDocsIssues инкапсулирует код, необходимый для запроса и анализа последнего открытого выпуска из репозитория GitHub. The GetAspNetDocsIssues method encapsulates the code needed to query for and parse out the latest open issues from a GitHub repository.

Для регистрации типизированного клиента можно использовать универсальный метод расширения AddHttpClient в Startup.ConfigureServices , указав класс типизированного клиента: To register a typed client, the generic AddHttpClient extension method can be used within Startup.ConfigureServices , specifying the typed client class:

Типизированный клиент регистрируется во внедрении зависимостей как временный. The typed client is registered as transient with DI. Типизированный клиент можно внедрить и использовать напрямую: The typed client can be injected and consumed directly:

При желании конфигурацию для типизированного клиента можно указать во время регистрации в Startup.ConfigureServices , а не в конструкторе типизированного клиента: If preferred, the configuration for a typed client can be specified during registration in Startup.ConfigureServices , rather than in the typed client’s constructor:

Можно полностью инкапсулировать HttpClient внутри типизированного клиента. It’s possible to entirely encapsulate the HttpClient within a typed client. Вместо предоставления его как свойства можно использовать открытые методы для внутреннего вызова экземпляра HttpClient . Rather than exposing it as a property, public methods can be provided which call the HttpClient instance internally.

В приведенном выше коде HttpClient хранится как закрытое поле. In the preceding code, the HttpClient is stored as a private field. Любой доступ для совершения внешних вызовов осуществляется через метод GetRepos . All access to make external calls goes through the GetRepos method.

Созданные клиенты Generated clients

IHttpClientFactory можно использовать в сочетании с другими библиотеками сторонних разработчиков, например Refit. IHttpClientFactory can be used in combination with other third-party libraries such as Refit. Refit — это библиотека REST для .NET. Refit is a REST library for .NET. Она преобразует REST API в динамические интерфейсы. It converts REST APIs into live interfaces. Реализация интерфейса формируется динамически с помощью RestService с использованием HttpClient для совершения внешних вызовов HTTP. An implementation of the interface is generated dynamically by the RestService , using HttpClient to make the external HTTP calls.

Для представления внешнего API и его ответа определяются интерфейс и ответ: An interface and a reply are defined to represent the external API and its response:

Можно добавить типизированный клиент, используя Refit для создания реализации: A typed client can be added, using Refit to generate the implementation:

При необходимости можно использовать определенный интерфейс с реализацией, предоставленной внедрением зависимостей и Refit: The defined interface can be consumed where necessary, with the implementation provided by DI and Refit:

ПО промежуточного слоя для исходящих запросов Outgoing request middleware

В HttpClient уже существует концепция делегирования обработчиков, которые можно связать друг с другом для исходящих HTTP-запросов. HttpClient already has the concept of delegating handlers that can be linked together for outgoing HTTP requests. Класс IHttpClientFactory упрощает определение обработчиков для применения к каждому именованному клиенту. The IHttpClientFactory makes it easy to define the handlers to apply for each named client. Он поддерживает регистрацию и объединение в цепочки нескольких обработчиков для создания конвейера ПО промежуточного слоя для исходящих запросов. It supports registration and chaining of multiple handlers to build an outgoing request middleware pipeline. Каждый из этих обработчиков может выполнять работу до и после исходящего запроса. Each of these handlers is able to perform work before and after the outgoing request. Этот шаблон похож на входящий конвейер ПО промежуточного слоя в ASP.NET Core. This pattern is similar to the inbound middleware pipeline in ASP.NET Core. Шаблон предоставляет механизм управления сквозной функциональностью HTTP-запросов, включая кэширование, обработку ошибок, сериализацию и ведение журнала. The pattern provides a mechanism to manage cross-cutting concerns around HTTP requests, including caching, error handling, serialization, and logging.

Чтобы создать обработчик, необходимо определить класс, производный от DelegatingHandler. To create a handler, define a class deriving from DelegatingHandler. Переопределите метод SendAsync для выполнения кода до передачи запросов следующему обработчику в конвейере: Override the SendAsync method to execute code before passing the request to the next handler in the pipeline:

В предыдущем коде определяется базовый обработчик. The preceding code defines a basic handler. Он проверяет, включен ли в запрос заголовок X-API-KEY . It checks to see if an X-API-KEY header has been included on the request. Если заголовок отсутствует, он может избежать вызовов HTTP и вернуть подходящий ответ. If the header is missing, it can avoid the HTTP call and return a suitable response.

Во время регистрации можно добавить один или несколько обработчиков в конфигурацию для HttpClient . During registration, one or more handlers can be added to the configuration for a HttpClient . Эта задача выполняется через методы расширения в IHttpClientBuilder. This task is accomplished via extension methods on the IHttpClientBuilder.

В приведенном выше коде ValidateHeaderHandler регистрируется с помощью внедрения зависимостей. In the preceding code, the ValidateHeaderHandler is registered with DI. Обработчик должен регистрироваться во внедрении зависимостей как временная служба, а не ограниченная. The handler must be registered in DI as a transient service, never scoped. Если обработчик зарегистрирован в качестве службы с областью действия и все службы, от которых зависит этот обработчик, освобождаются: If the handler is registered as a scoped service and any services that the handler depends upon are disposable:

  • Службы обработчика могли быть удалены, прежде чем обработчик вышел из области действия. The handler’s services could be disposed before the handler goes out of scope.
  • Освобожденные службы обработчика приводят к его сбою. The disposed handler services causes the handler to fail.

После регистрации можно вызвать AddHttpMessageHandler, передав тип обработчика. Once registered, AddHttpMessageHandler can be called, passing in the handler type.

Можно зарегистрировать несколько обработчиков в порядке, в котором они должны выполняться. Multiple handlers can be registered in the order that they should execute. Каждый обработчик содержит следующий обработчик, пока последний HttpClientHandler не выполнит запрос: Each handler wraps the next handler until the final HttpClientHandler executes the request:

Используйте один из следующих методов для предоставления общего доступа к состоянию отдельных запросов с помощью обработчиков сообщений: Use one of the following approaches to share per-request state with message handlers:

  • Передайте данные в обработчик с помощью HttpRequestMessage.Properties . Pass data into the handler using HttpRequestMessage.Properties .
  • Используйте IHttpContextAccessor для доступа к текущему запросу. Use IHttpContextAccessor to access the current request.
  • Создайте пользовательский объект хранилища AsyncLocal для передачи данных. Create a custom AsyncLocal storage object to pass the data.

Использование обработчиков на основе Polly Use Polly-based handlers

IHttpClientFactory интегрируется с популярной библиотекой сторонних разработчиков под названием Polly. IHttpClientFactory integrates with a popular third-party library called Polly. Polly — это комплексная библиотека, обеспечивающая отказоустойчивость и обработку временных сбоев в .NET. Polly is a comprehensive resilience and transient fault-handling library for .NET. Она позволяет разработчикам выражать политики, например политику повтора, размыкателя цепи, времени ожидания, изоляции отсеков и отката, более эффективным и потокобезопасным образом. It allows developers to express policies such as Retry, Circuit Breaker, Timeout, Bulkhead Isolation, and Fallback in a fluent and thread-safe manner.

Для использования политик Polly с настроенными экземплярами HttpClient предоставляются методы расширения. Extension methods are provided to enable the use of Polly policies with configured HttpClient instances. Расширения Polly: The Polly extensions:

  • Поддерживает добавление обработчиков на основе Polly клиентам. Support adding Polly-based handlers to clients.
  • Можно использовать после установки пакета NuGet Microsoft.Extensions.Http.Polly. Can be used after installing the Microsoft.Extensions.Http.Polly NuGet package. Пакет не включен в общую платформу ASP.NET Core. The package isn’t included in the ASP.NET Core shared framework.

Обработка временных сбоев Handle transient faults

Чаще всего ошибки происходят, когда внешние вызовы HTTP являются временными. Most common faults occur when external HTTP calls are transient. Используется удобный метод расширения AddTransientHttpErrorPolicy , который позволяет определить политику для обработки временных ошибок. A convenient extension method called AddTransientHttpErrorPolicy is included which allows a policy to be defined to handle transient errors. Политики, заданные с помощью этого метода расширения, обрабатывают HttpRequestException , ответы HTTP 5xx и ответы HTTP 408. Policies configured with this extension method handle HttpRequestException , HTTP 5xx responses, and HTTP 408 responses.

Расширение AddTransientHttpErrorPolicy может быть использовано в Startup.ConfigureServices . The AddTransientHttpErrorPolicy extension can be used within Startup.ConfigureServices . Данное расширение предоставляет доступ к объекту PolicyBuilder , настроенному для обработки ошибок, представляющих возможный временный сбой: The extension provides access to a PolicyBuilder object configured to handle errors representing a possible transient fault:

В приведенном выше коде определена политика WaitAndRetryAsync . In the preceding code, a WaitAndRetryAsync policy is defined. Неудачные запросы повторяются до трех раз с задержкой 600 мс между попытками. Failed requests are retried up to three times with a delay of 600 ms between attempts.

Динамический выбор политик Dynamically select policies

Существуют дополнительные методы расширения, которые можно использовать для добавления обработчиков на основе Polly. Additional extension methods exist which can be used to add Polly-based handlers. Одним из таких расширений является AddPolicyHandler с несколькими перегрузками. One such extension is AddPolicyHandler , which has multiple overloads. Одна перегрузка разрешает проверку запроса для определения необходимой политики: One overload allows the request to be inspected when defining which policy to apply:

Если в приведенном выше коде исходящий запрос является запросом HTTP GET, применяется время ожидания 10 секунд. In the preceding code, if the outgoing request is an HTTP GET, a 10-second timeout is applied. Для остальных методов HTTP время ожидания — 30 секунд. For any other HTTP method, a 30-second timeout is used.

Добавление нескольких обработчиков Polly Add multiple Polly handlers

Общепринятой практикой является вложение политик Polly для предоставления расширенной функциональности: It’s common to nest Polly policies to provide enhanced functionality:

В приведенном выше примере добавляются два обработчика. In the preceding example, two handlers are added. Первый использует расширение AddTransientHttpErrorPolicy , чтобы добавить политику повтора. The first uses the AddTransientHttpErrorPolicy extension to add a retry policy. Неудачные запросы выполняются повторно до трех раз. Failed requests are retried up to three times. Второй вызов к AddTransientHttpErrorPolicy добавляет политику размыкателя цепи. The second call to AddTransientHttpErrorPolicy adds a circuit breaker policy. Дополнительные внешние запросы блокируются в течение 30 секунд в случае пяти неудачных попыток подряд. Further external requests are blocked for 30 seconds if five failed attempts occur sequentially. Политики размыкателя цепи отслеживают состояние. Circuit breaker policies are stateful. Все вызовы через этот клиент имеют одинаковое состояние цепи. All calls through this client share the same circuit state.

Добавление политик из реестра Polly Add policies from the Polly registry

Подход к управлению регулярно используемыми политиками заключается в их однократном определении и регистрации с помощью PolicyRegistry . An approach to managing regularly used policies is to define them once and register them with a PolicyRegistry . Предоставляется метод расширения, разрешающий добавление обработчика с помощью политики из реестра: An extension method is provided which allows a handler to be added using a policy from the registry:

В приведенном выше коде, когда PolicyRegistry добавляется в ServiceCollection , регистрируются две политики. In the preceding code, two policies are registered when the PolicyRegistry is added to the ServiceCollection . Чтобы использовать политику из реестра, применяется метод AddPolicyHandlerFromRegistry , который передает имя необходимой политики. To use a policy from the registry, the AddPolicyHandlerFromRegistry method is used, passing the name of the policy to apply.

Дополнительные сведения об интеграции IHttpClientFactory и Polly см. на вики-сайте Polly. Further information about IHttpClientFactory and Polly integrations can be found on the Polly wiki.

Управление HttpClient и временем существования HttpClient and lifetime management

При каждом вызове CreateClient в IHttpClientFactory возвращается новый экземпляр HttpClient . A new HttpClient instance is returned each time CreateClient is called on the IHttpClientFactory . Для каждого названного клиента существует HttpMessageHandler. There’s an HttpMessageHandler per named client. Фабрика обеспечивает управление временем существования экземпляров HttpMessageHandler . The factory manages the lifetimes of the HttpMessageHandler instances.

IHttpClientFactory объединяет в пул все экземпляры HttpMessageHandler , созданные фабрикой, чтобы уменьшить потребление ресурсов. IHttpClientFactory pools the HttpMessageHandler instances created by the factory to reduce resource consumption. Экземпляр HttpMessageHandler можно использовать повторно из пула при создании экземпляра HttpClient , если его время существования еще не истекло. An HttpMessageHandler instance may be reused from the pool when creating a new HttpClient instance if its lifetime hasn’t expired.

Создавать пулы обработчиков желательно, так как каждый обработчик обычно управляет собственными базовыми HTTP-подключениями. Pooling of handlers is desirable as each handler typically manages its own underlying HTTP connections. Создание лишних обработчиков может привести к задержке подключения. Creating more handlers than necessary can result in connection delays. Некоторые обработчики поддерживают подключения открытыми в течение неопределенного периода, что может помешать обработчику отреагировать на изменения DNS. Some handlers also keep connections open indefinitely, which can prevent the handler from reacting to DNS changes.

Время существования обработчика по умолчанию — две минуты. The default handler lifetime is two minutes. Значение по умолчанию можно переопределить для каждого именованного клиента. The default value can be overridden on a per named client basis. Чтобы переопределить это значение, вызовите SetHandlerLifetime в IHttpClientBuilder , который возвращается при создании клиента: To override it, call SetHandlerLifetime on the IHttpClientBuilder that is returned when creating the client:

Высвобождать клиент не требуется. Disposal of the client isn’t required. Высвобождение отменяет исходящие запросы и гарантирует, что указанный экземпляр HttpClient не может использоваться после вызова Dispose. Disposal cancels outgoing requests and guarantees the given HttpClient instance can’t be used after calling Dispose. IHttpClientFactory отслеживает и высвобождает ресурсы, используемые экземплярами HttpClient . IHttpClientFactory tracks and disposes resources used by HttpClient instances. Экземпляры HttpClient обычно можно рассматривать как объекты .NET, не требующие высвобождения. The HttpClient instances can generally be treated as .NET objects not requiring disposal.

До появления IHttpClientFactory один экземпляр HttpClient часто сохраняли в активном состоянии в течение длительного времени. Keeping a single HttpClient instance alive for a long duration is a common pattern used before the inception of IHttpClientFactory . После перехода на IHttpClientFactory это уже не нужно. This pattern becomes unnecessary after migrating to IHttpClientFactory .

Ведение журнала Logging

Клиенты, созданные через IHttpClientFactory , записывают сообщения журнала для всех запросов. Clients created via IHttpClientFactory record log messages for all requests. Установите соответствующий уровень информации в конфигурации ведения журнала, чтобы просматривать сообщения журнала по умолчанию. Enable the appropriate information level in your logging configuration to see the default log messages. Дополнительное ведение журнала, например запись заголовков запросов, включено только на уровне трассировки. Additional logging, such as the logging of request headers, is only included at trace level.

Категория журнала для каждого клиента включает в себя имя клиента. The log category used for each client includes the name of the client. Клиент с именем MyNamedClient, например, записывает в журнал сообщения с категорией System.Net.Http.HttpClient.MyNamedClient.LogicalHandler . A client named MyNamedClient, for example, logs messages with a category of System.Net.Http.HttpClient.MyNamedClient.LogicalHandler . Сообщения с суффиксом LogicalHandler создаются за пределами конвейера обработчиков запросов. Messages suffixed with LogicalHandler occur outside the request handler pipeline. Во время запроса сообщения записываются в журнал до обработки запроса другими обработчиками в конвейере. On the request, messages are logged before any other handlers in the pipeline have processed it. Во время ответа сообщения записываются в журнал после получения ответа другими обработчиками в конвейере. On the response, messages are logged after any other pipeline handlers have received the response.

Кроме того, журнал ведется в конвейере обработчиков запросов. Logging also occurs inside the request handler pipeline. В примере MyNamedClient эти сообщения вносятся в журнал по категории журнала System.Net.Http.HttpClient.MyNamedClient.ClientHandler . In the MyNamedClient example, those messages are logged against the log category System.Net.Http.HttpClient.MyNamedClient.ClientHandler . Во время запроса это происходит после выполнения всех обработчиков и непосредственно перед отправкой запроса по сети. For the request, this occurs after all other handlers have run and immediately before the request is sent out on the network. Во время ответа в журнале записывается состояние ответа перед его передачей обратно по конвейеру обработчиков. On the response, this logging includes the state of the response before it passes back through the handler pipeline.

Включив ведение журнала в конвейере и за его пределами, можно выполнять проверку изменений, внесенных другими обработчиками конвейера. Enabling logging outside and inside the pipeline enables inspection of the changes made by the other pipeline handlers. Сюда входят, например, изменения заголовков запросов или кода состояния ответов. This may include changes to request headers, for example, or to the response status code.

Включение имени клиента в категорию журнала позволяет фильтровать журналы по именованным клиентам при необходимости. Including the name of the client in the log category enables log filtering for specific named clients where necessary.

Настройка HttpMessageHandler Configure the HttpMessageHandler

Иногда необходимо контролировать конфигурацию внутреннего обработчика HttpMessageHandler , используемого клиентом. It may be necessary to control the configuration of the inner HttpMessageHandler used by a client.

При добавлении именованного или типизированного клиента возвращается IHttpClientBuilder . An IHttpClientBuilder is returned when adding named or typed clients. Для определения делегата можно использовать метод расширения ConfigurePrimaryHttpMessageHandler. The ConfigurePrimaryHttpMessageHandler extension method can be used to define a delegate. Делегат используется для создания и настройки основного обработчика HttpMessageHandler , используемого этим клиентом: The delegate is used to create and configure the primary HttpMessageHandler used by that client:

Использование IHttpClientFactory в консольном приложении Use IHttpClientFactory in a console app

В консольном приложении добавьте в проект следующие ссылки на пакеты: In a console app, add the following package references to the project:

В следующем примере: In the following example:

  • IHttpClientFactory регистрируется в контейнере службы универсального узла: IHttpClientFactory is registered in the Generic Host’s service container.
  • MyService создает экземпляр фабрики клиента из службы, который используется для создания HttpClient . MyService creates a client factory instance from the service, which is used to create an HttpClient . HttpClient используется для получения веб-страницы. HttpClient is used to retrieve a webpage.
  • Main создает область для выполнения метода GetPage службы и вывода первых 500 символов содержимого веб-страницы на консоль. Main creates a scope to execute the service’s GetPage method and write the first 500 characters of the webpage content to the console.

Techiediaries

What is HttpClient in Angular?

In this tutorial we’ll be seeing a detailed guide with examples using the new HttpClient in Angular 8 available from the @angular/common/http module starting with Angular 4.3+ and which replaces the old HTTP client that was available from the @angular/http package. This upgrade is not just a change in the name and import path of the module but brings a whole new and powerful features for how you make HTTP requests in Angular.

In this tutorial, we are going to learn how to use HttpClient by example in Angular 8|7. We’ll see how to send HTTP POST, GET, PUT and DELETE requests to a back-end server.

The modern web has dramatically evolved in the last few years. Browsers can now run complex JavaScript web applications and most often than not these apps need to fetch data from remote HTTP servers to display it to the users.

Modern browsers provide two different mechanisms for sending HTTP requests and getting responses from web servers:

  • The old XMLHttpRequest interface which is wrapped by most existing JS libraries (such as jQuery ) in a simple to use API.
  • The relatively new fetch() API.

Note: HttpClient is based on the XMLHttpRequest interface which makes it available in all existing web browsers.

On top of the XMLHttpRequest interface, HttpClient prov >

  • Testing APIs,
  • Typed request and response objects,
  • Request and response interceptors,
  • Observable based APIs,
  • And better error handling.

You need to use HttpClient to communicate with your back-end HTTP server or a third-party server that has CORS enabled but first you have to import it in your Angular application. These are the steps in nutshell:

  • First, import HttpClientModule from @angular/common/http .
  • Next, open the main application module ( AppModule ) and add HttpClientModule in the imports array.

Note: Importing HttpClientModule in the root application module will make it available everywhere in your Angular application. You can also import it in a sub-module where it will be available only in that module.

Note: This tutorial is intended for the new HttpClient module, available starting from Angular 4.3+ via the @angular/common/http package.

We’ll be seeing examples of common HTTP methods such as GET, PUT, PATCH, POST and DELETE, that you usually need to use when communicating with a REST API server.

By the end of this tutorial, you’ll learn:

  • What is HttpClient and how to use with Angular 8|7,
  • How to setup the HttpClientModule,
  • How to create an example API server with json-server,
  • How to send an example GET request with Angular 8 and HttpClient.get() ,
  • How to send an example POST request with Angular 8 and HttpClient.post() ,
  • How to send an example PUT request with Angular 8 and HttpClient.put() ,
  • How to send an example DELETE request with Angular 8 and HttpClient.delete()

For a more detailed tutorial about HttpClient. Read Angular 6|7: HttpClient—Building a Service for Sending API Calls and Fetching Data for learning how to create a complete Angular 7 application that uses HttpClient for sending HTTP requests.

Note: Check out how to build a developer’s portfolio web application with Angular 7.1, Firebase and Firestore from these series:

Introducing Angular 8 HttpClient Module

Angular 6 deprecated the old HTTP client in favor of the newer HttpClient module which is an improved version of the Http client API that lives in the @angular/common/http package. The old API is still available in @angular/http in Angular 6, but will be removed in next versions, for easing the migration process of existing Angular 4+ applications.

Now, let’s see how to actually use the HttpClient module.

Setting up the HttpClient Module in Angular 8

Before you can use the new HttpClient module in your Angular 8 application, you need to add it to the imports array in the application main module. Start by importing the HttpClientModule module from the @angular/common/http package:

Next, add the HttpClientModule module to the imports array of the main root module:

After adding the module to the imports array, we are now ready to use the new HttpClient API to send GET, POST, PUT and DELETE requests to a REST HTTP server.

Creating an Example REST API Server for Our Angular 8 Application

In this tutorial, we don’t need to create a REST API instead we’ll use json-server which allows us to quickly create a fake RESTful server and expose fake API endpoints, from sample data in a JSON file.

Note: If you already have a back-end server with a REST API to consume, you can skip this part.

What is REST

Before creating an fake REST API server, let’s first understand what is REST.

Wikipedia defines REST as:

Representational State Transfer (REST) is a software architectural style that defines a set of constraints to be used for creating web services. Web services that conform to the REST architectural style, termed RESTful web services, provide interoperability between computer systems on the Internet. RESTful web services allow the requesting systems to access and manipulate textual representations of web resources by using a uniform and predefined set of stateless operations. Other kinds of web services, such as SOAP web services, expose their own arbitrary sets of operations

In more simple words: REST is a set of HTTP endpoints that provide a CRUD (Create, Read, Update, and Delete) interface on some server resources.

Creating the REST API

First, you need to install json-server via npm by running the following command:

Note: This will install the package globally. You might need to use a CMD with administrator privileges in Windows or add sudo before your command in Linux systems in order to be able to install packages globally on your system without getting permission errors. As the time of writing, json-server v0.14.2 will be installed.

Next, you need to create a JSON file, which will act as a database for our server. First, create a folder for our full-stack project and navigate inside it:

Next, create a server folder inside the angular-httpclient-demo folder and navigate to it:

Next, create a database.json file:

Open the server/database.json file and add the following data:

You can either add some items manually or better yet let’s use Faker.js to automatically generate massive amounts of realistic fake data in Node.js and the browser.

First, initialize an empty Node.js module in the server folder:

This will generate a package.json file with default values:

Next, install Faker.js from npm using the following command:

As of this writing, faker v4.1.0 will be installed.

Now, create a generate.js file:

Open it and add the following code:

We first import faker, next we declare an object with one empty array for customers then we enter a for loop to create 300 fake entries using faker methods like faker.name.firstName() for generating a random first name. Check all available methods. Finally we convert the database object to a string and log it to the terminal.

Next, add a generate script to package.json to generate the database file:

You can then run this command to create your database.json file and populate it:

Finally, run the API server by executing the following command:

You can now send HTTP requests to the server just like any typical REST server. Your RESTful server will be available from the http://127.0.0.1:3000/ address.

These are the API endpoints we’ll be able to use via this REST server and using the previous configuration:

  • GET /customers for getting the customers,
  • GET /customers/ for getting a single customer by id,
  • POST /customers for creating a new customer,
  • PUT /customers/ for updating a customer by id,
  • PATCH /customers/ for partially updating a customer by id,
  • DELETE /customers/ for deleting a customer by id.

You can use _page and _limit parameters to get paginated data. In the Link header you’ll get first , prev , next and last links.

GET /customers?_page=1 for getting the first page of data, GET /customers?_page=1&_limit=5 for getting the first five customers of the first page of data.

Note: You can use other features such as filters, sorting and ordering. For more information, check out the docs.

Installing Angular CLI 8

Angular CLI is the official tool for creating Angular projects. Open a new terminal and run the following command to install it:

At the time of this writing @angular/cli v8.0.0-beta.11 is installed.

You need to have Node.js installed on your system. On Ubuntu you can follow this tutorial.

Note: You may need to use a CMD line with admin access in Windows or add sudo in Linux and macOS for installing npm packages globally. You need to have Node.js installed on your system. On Ubuntu you can follow this tutorial.

As of this writing, Angular CLI v7.1.4 will be installed.

Creating an Angular 8 Project

After creating the API server, we can now proceed to create our Angular project using Angular CLI v8. In your terminal, navigate to the angular-httpclient-demo folder and run the following command:

The CLI will ask you if you Would you like to add Angular routing? (y/N) Type y and Which stylesheet format would you like to use? (Use arrow keys) Choose CSS and type Enter . Your project should start generating the necessary files and installing the dependencies.

Now that we have created the project, before making of HttpClient to send HTTP requests let’s first create the basic buildings of our demo application which are simply an HttpService that interfaces with the REST server and a bunch of components for making a CRUD interface that calls the methods of HttpService .

Creating an Angular Service

Let’s start with the HttpService . In your terminal, run:

The command will generate the src/app/http.service.spec.ts (for tests) and src/app/http.service.ts files.

Note: Make sure you have navigated inside the frontend folder before running Angular CLI commands.

Creating Angular Components

Next, let’s create four components for displaying (list and by id) and creating/updating the customers:

Adding Routing & Navigation

To be able to navigate between these components, we need to add them to the router configuration. Open the src/app/app-routing.module.ts file and update it accordingly:

Example of Making HTTP GET Requests using HttpClient in Angular 8|7

In this section we suppose that we have a component that displays a list of customers from a server.

First let’s see the required steps:

Import HttpClient from @angular/common/http

Inject HttpClient via component constructor

Make HTTP GET Requests using .get(endpoint) method

Subscribe to the returned observable and show results

Here is the source code of our example:

HTTP GET Request Parameters: HttpParams

In many situations, we need to feed some HTTP parameters to the API endpoint we are querying. In this section we’ll see how to use the HttpParams class to use parameters in the HttpClient module.

For instance, let’s suppose that we need to make a GET request to this http://127.0.0.1:3000/customers?_page=1&_limit=1 URL for getting the first two customers of the first page.

We start by importing the HttpParams class using:

Next, we create an instance of the HttpParams class:

Finally, we call httpClient.get() method with these parameters, then assign the returned Observable to the customersObservable variable:

Using fromString to easily create HttpParams

We can also build HTTP parameters directly from a query string, for example for our previous example URL http://127.0.0.1:3000/customers?_page=1&_limit=1 we can create an instance of HttpParams class from the query string _page=1&_limit=1 by simply using the fromString variable:

Generic HttpClient request() method

We have previously seen how to use the .get() method to send HTTP GET requests. Now we’ll see a generic method to

send GET and the other HTTP methods such as POST, PUT and Delete etc.

Using the .request() method of the HttpClient module we can re-write our previous example to the following code:

Adding custom HTTP Headers to requests

We can also add custom HTTP headers to our HTTP requests using the HttpHeaders class.

First create an instance of the HttpHeaders class and then set your custom HTTP header. For example:

Next, you can send the GET request using:

Sending HTTP PUT Requests in Angular 8

The HTTP PUT method is used to completely replace a resource on the API server. We can use the HttpClient module to send a PUT request to an API server using the the put() method. For example:

Sending HTTP PATCH Requests

The HTTP PATCH method is used to update a resource on the server. The HttpClient class provides the patch() method tha can be used to send UPDATE requests. For example:

Sending HTTP DELETE Requests

Now let’s see an example of how we can send an HTTP DELETE request to delete a resource from the API server using delete() method provided by the HttpClient class:

Sending HTTP POST Requests in Angular 8

The HTTP POST method has many uses but mostly used when we need to add new data on the server so let’s take an example of adding a new customer to our REST API server database using the post() method of the HttpClient class:

We are calling the post() method from the injected instance of HttpClient. The first parameter is the API endpoint and the second parameter is the customer data object. We also subscribe to the observable returned by the post() method. If the operation is successful we display POST Request is successful and the data on the console. If there is an error we log the error on the console

Also read: How to send HTTP requests with React and Axios

For a step by step tutorial. Make sure to read

Angular 6|7: HttpClient—Building a Service for Sending API Calls and Fetching Data for learning how to build a complete Angular 7 application that makes use of HttpClient.

Conclusion

So we have seen how to interact with a RESTful API server using common HTTP methods i.e GET, PUT, PATCH, DELETE and POST.

For the sake of testing we have used a fake REST API server but you can use the same examples with a real backend server.

Note: We also publish our tutorials on Medium and DEV.to. If you prefer reading in these platforms, you can follow us there to get our newest articles.

You can reach the author via Twitter:

About the author

Get our Learn Angular 8 in 15 Easy Steps ebook in pdf, epub and mobi formats, plus a new Angular 8 tutorial every 3 days.

Online Courses (Affiliate)

If you prefer learning with videos. Check out one of the best Angular courses online
Angular 8 — The Complete Guide (2020+ Edition)

Angular Crash Course for Busy Developers

Как настроить baseUrl для Angular HttpClient?

В документации я не нашел способа установить URL базового API для всех запросов http. Можно ли это сделать с Angular HttpClient?

5 ответов

Используйте новый HttpClient Interceptor.

Создайте правильную HttpInterceptor которая реализует HttpInterceptor :

HttpInterceptor может клонировать запрос и изменять его по своему желанию, в этом случае я определил путь по умолчанию для всех запросов http.

Предоставьте HttpClientModule со следующими конфигурациями:

Теперь все ваши запросы будут начинаться с your-api-url/

Основываясь на очень полезном ответе TheUnreal , можно написать перехватчик, чтобы получить базовый URL через DI:

BASE_API_URL может быть предоставлен модулем приложения:

где environment — это объект, автоматически создаваемый CLI при создании проекта:

Почему бы не создать подкласс HttpClient с настраиваемым baseUrl? Таким образом, если вашему приложению необходимо обмениваться данными с несколькими службами, вы можете использовать разные подклассы для каждого или создать несколько экземпляров одного подкласса, каждый из которых имеет свою конфигурацию.

Я думаю, что по умолчанию нет способа сделать это. Сделайте HttpService, и внутри вы сможете определить свойство вашего URL по умолчанию и создать методы для вызова http.get и других с вашим URL свойства. Затем введите HttpService вместо HttpClient

вам не обязательно нужен базовый URL с HttpClient , в документации сказано, что вам просто нужно указать API-часть запроса, если вы делаете вызовы на один и тот же сервер, это просто так:

Однако вы можете, если хотите или хотите, указать базовый URL.

У меня есть 2 предложения для этого:

1 Вспомогательный класс со статическим свойством класса.

2 Базовый класс со свойством класса, поэтому любой новый сервис должен расширять его:

Топ-пост этого месяца:  Производим в OpenCart импорт товаров из CSV пошаговая инструкция по созданию системы
Добавить комментарий