オリジナルます。https://www.stevejgordon.co.uk/httpclientfactory-named-typed-clients-aspnetcore
投稿者:2018年1月
前の記事「HttpClientFactoryはじめに」私は、この機能を作成する理由を説明しました。私たちは、それが解決した後、WebAPIのアプリケーションでそれを使用する方法を示して非常に基本的な例を含むことができ、問題を知っています。(クライアントの名前)は、クライアントの名前とクライアントの種類(クライアントを入力):この記事では、私はあなたがそれを使用することができ、他の二つの方法を議論したいと思います。
クライアントの名前(名前クライアント)
最初の記事では、私は基本的にHttpClientインスタンスを取得するためにHttpClientFactoryを使用する方法を示します。あなただけの単一の場所からすぐに良いですが、要求を、送信するとき。しかし、一般的に、あなたは、コード内の複数の場所から同じサービスに複数の要求を加えることができます。
クライアントの概念を命名することにより、HttpClientFactoryはこれが容易になります。あなたはHttpClientをを作成するときに、いくつかの特定の設定を含むレジストリを作成することができ、クライアントの名前を使用してください。あなたがクライアントの複数の名前を登録することができ、各クライアントは、事前に異なる設定で構成することができます。
この概念は、より具体的にするために、例を見てみましょう。私Startup.ConfigureServices方法では、AddHttpClient異なるオーバーロードされたメソッドは、2つの追加のパラメーターを受け入れます。名前とアクションデリゲートを入れHttpClientを「告げました」。ConfigureServicesコード:
公共 のボイドConfigureServices(IServiceCollectionサービス) { services.AddHttpClient(" GitHubClient "、クライアント=> { client.BaseAddress = 新しいウリ(" https://api.github.com/ " ); client.DefaultRequestHeaders.Addは(" 同意します"、" アプリケーション/ vnd.github.v3 + JSON " ); client.DefaultRequestHeaders.Add(" ユーザエージェント"、" HttpClientFactoryTesting " ); }); services.AddMvc(); }
最初の文字列パラメータは、このクライアントの名前が登録されています。アクション<HttpClientを>欧州委員会は、私たちがHttpClientをを構築するとき、私たちはそれらを設定することができます。我々は、ベースアドレスと要求ヘッダーのプレ既知数を定義することができるので、これは便利です。私たちは、クライアントの名前を要求したとき、それは私たちのために新しいクライアントを作成し、毎回あなたは、この設定を適用します。
使用する場合、クライアントを要求するために、名前でCreateClient:
[ルート(" API / [コントローラー] " )] パブリック クラスValuesController:コントローラ { プライベート 読み取り専用IHttpClientFactory _httpClientFactory。 公共ValuesController(IHttpClientFactory httpClientFactory) { _httpClientFactory = httpClientFactory。 } [HTTPGET] パブリック 非同期タスク<のActionResult> のGet() { VARクライアント= _httpClientFactory.CreateClient(" GitHubClient " )。 VaRの結果は= 待ちますclient.GetStringAsync(" / " ); 戻るOK(結果を)。 } }
この例では、HttpClientをインスタンス我々はアドレス(ベースアドレスセット)の基本セットを作成しましたので、私たちのGetStringAsync方法は、対応するURIに渡すことができます。
私たちがコントロールできるように、道のこの命名は、HttpClientをコンフィギュレーションを適用しています。私は忠実なファンの「魔法の文字列」はないですので、私は名前のクライアントを使用している場合、私は、文字列定数、クライアント名を含む静的クラスを持っているかもしれません。このように:
パブリック 静的 クラスNamedHttpClients { 公共 のconst ストリング GitHubClient = 「GitHubClient 」。 }
登録(またはリクエスト)クライアント、我々はむしろ「魔法の文字列」よりも、静的クラス値を使用することができます。
services.AddHttpClient(NamedHttpClients.GitHubClient、クライアント=> { client.BaseAddress = 新しいウリ(" https://api.github.com/ " ); client.DefaultRequestHeaders.Add(" 同意する"、「アプリケーション/ vnd.github。 V3 + JSON " ); client.DefaultRequestHeaders.Add(" ユーザエージェント" " HttpClientFactoryTesting " ); });
これは非常に良いですが、私たちは、クライアント定義の型を使用する方法を見てみましょう、さらに行くことができます。
クライアントのタイプ(型指定されたクライアント)
クライアントの種類は、私たちはコンストラクタを介してカスタムクラスのHttpClient注射を定義することができます。私たちは、拡張メソッドIHttpClientBuilderリンクDIシステムを使用し、またはAddHttpClientカスタムタイプを受信するための汎用的なメソッドを使用します。私たちは、カスタムクラスを作成したら、我々は直接HttpClientを開示することができ、より良い外部サービスの利用を規定するように、HTTPの呼び出しは、特定の方法でカプセル化することができます。このアプローチはまた、我々はもはや「魔法の文字列」する必要があり、それがより合理的と思われることを意味しません。
のは、クライアントからの型の定義の基本的な例を見てみましょう:
パブリック クラスMyGitHubClient { 公共MyGitHubClient(HttpClientをクライアント) { クライアント = クライアント。 } 公共のHttpClientクライアント{ 得ます。} }
このクラスは、HttpClientを、コンストラクタのパラメータとして受け入れる必要があります。今、私たちは、HttpClientをインスタンスのパブリックプロパティを設定しています。
その後、我々は中ConfigureServicesに登録する必要があります。
公共 のボイドConfigureServices(IServiceCollectionサービス) { services.AddHttpClient <MyGitHubClient>(クライアント=> { client.BaseAddress = 新しいウリ(" https://api.github.com/ " ); client.DefaultRequestHeaders.Addは(" 同意します"、" アプリケーション/ vnd.github.v3 + JSON " ); client.DefaultRequestHeaders.Add(" ユーザエージェント"、" HttpClientFactoryTesting " ); }); services.AddMvc();
私たちは、ジェネリックAddHttpClientにパラメータとして渡さMyGitHubClientます。これは、DIシステム内の過渡的範囲として登録されました。私たちのカスタムクラスとしてのHttpClientを受け入れること、それゆえ「工場」に関連した適切に構成のHttpClientのインスタンスを作成し、それを注入しました。コントローラは、今IHttpClientFactory代わりに、クライアントの私達のタイプを受け入れるように更新することができます。
[ルート(" API / [コントローラー] " )] パブリック クラスValuesController:コントローラ { プライベート 読み取り専用MyGitHubClient _gitHubClient。 公共ValuesController(MyGitHubClient gitGitHubClient) { _gitHubClient = gitGitHubClient。 } [HTTPGET] パブリック 非同期タスク<のActionResult> プレゼント() { VARの結果= 待つ _gitHubClient.Client.GetStringAsync(" / " )。 戻るOK(結果を)。 } }
クライアントの私達のカスタムタイプは、プロパティを介してのHttpClientを開示しているので、私たちは、HTTP呼び出しを指示するためにそれを使用することができます。
封装のHttpClient(HttpClientをカプセル化)
最後の例では、我々は完全にHttpClientをカプセル化したい状況です。私たちは、エンドポイント定義プロセスの特定のメソッドを呼び出したい場合は、このメソッドを使用して、最も可能性が高いです。この場合、我々は、応答をカプセル化することができ、単一の場所でそれを処理するために、各認証方式でデシリアライズ。
パブリック インターフェースIMyGitHubClient { タスク < INT > GetRootDataLength(); } パブリック クラスMyGitHubClient:IMyGitHubClient { プライベート 読み取り専用のHttpClient _client。 公共MyGitHubClient(HttpClientをクライアント) { _client = クライアント。 } パブリック 非同期タスク< INT > GetRootDataLength() { VARのデータ=を待つ _client.GetStringAsync(" / " )。 リターンdata.Length; } }
この場合、我々は民間の読み取り専用フィールドで、設定のHttpClientに格納注入しました。そして、直接、異なるHttpClientを通過(クラス)を取得し、我々は、HTTP GetRootDataLength呼び出し、要求された長さを返すを実行するための方法を提供します。簡単な例として、しかし、あなたはすでに知っている必要があります!
現在、以下に示すように、受け入れ、インタフェースを使用するようにコントローラを更新することができます。
[ルート(" API / [コントローラー] " )] パブリック クラスValuesController:コントローラ { プライベート 読み取り専用IMyGitHubClient _gitHubClient。 公共ValuesController(IMyGitHubClient gitHubClient) { _gitHubClient = gitHubClient。 } [HTTPGET] パブリック 非同期タスク<のActionResult> プレゼント() { VARの結果=を待つ)(_gitHubClient.GetRootDataLengthします。 戻るOK(結果を)。 } }
現在のHttpClientと直接対話する必要なく、インターフェイスで定義されたGetRootDataLengthメソッドを呼び出すことができます。これは、我々は、コントローラをテストする際、テストのために、簡単にIMyGitHubClientをシミュレートすることができ便利です。最後のテストのHttpClient少し痛みは、道の私のいつもの習慣に応じてより多くのコードが存在します。
DIコンテナに登録され、ConfigureServicesは次のようになります。
services.AddHttpClient <IMyGitHubClient、MyGitHubClient>(クライアント=> { client.BaseAddress = 新しいウリ(" https://api.github.com/ " ); client.DefaultRequestHeaders.Add(" 同意"、「アプリケーション/ vnd.github .v3 + JSON " ); client.DefaultRequestHeaders.Add(" ユーザエージェント" " HttpClientFactoryTesting " ); });
AddHttpClientはDIシグネチャに対応する2つの一般的なパラメータを受け入れる署名を有します。
概要
この記事では、我々は、私たちはさまざまな構成のHttpClientインスタンスを作成するために特定の名前を使用することができますHttpClientFactoryいくつかのより高度な方法を、探ります。その後、我々は受け入れる私たち自身のクラス、HttpClientをインスタンスを達成延長することにより、クライアントのタイプを使用することを議論します。私たちは直接、HttpClientを開くことができ、リモートエンドポイントにアクセスするには、このクラスへの呼び出しをカプセル化することができます。
次の記事では、我々は他のモード「発信要求ミドルウェア」(発信要求ミドルウェア)が達成するために使用DelegatingHandlersについて説明します。