アプリ開発ときどきアウトドア

主にJavaを使ったアプリ開発やトラブルシューティング等のノウハウ、キャンプや登山の紹介や体験談など。

1. システムエンジニアリング ASP.NET Core 実装技術

ASP.NET Core: IHttpClientFactoryの単純サンプル

投稿日:


IHttpClientの使い方やサンプルの記事を書きましたが、後から見るとちょっと量が多いと感じました。
とりあえず動かしてみたい、概略を知りたい、急いでいる等の人向けに、もっと単純なサンプルを用意してみました。
冒頭の「IHttpClientの使い方やサンプルの記事」については下記をご覧ください。

使い方の要点

  • HttpClientを単独で使うと色々な問題があるので、IHttpClientFactoryを使うことを推奨しています。
  • IHttpClientFactoryからHttpClientを生成する方法が4つありますが、ここでは最も単純な方法を使います。業務ではこの方法は使わないと思うので、参考としてご覧ください。
  • 完全なプロジェクトはこちらをご確認ください。

単純なサンプル

ASP.NET CoreのコントローラからIHttpClientFactoryを使ってWebAPIを実行するサンプルになります。

  1. サービス登録
    IHttpClientFactoryを使ってHttpClientクライアントを使う方法は、既定のクライアントを使う方法、名前付きクライアントを使う方法、型付きクライアントを使う方法等があります。
    その中で最も単純な「既定のクライアント」を使う場合、次のようにAddHttpClient()を宣言するのみです。
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddControllersWithViews();
    
        services.AddHttpClient();
    ...
    
  2. GET/POSTの実行
    IHttpClientFactoryは「依存関係の注入」で使用するため、コンストラクタの引数で指定します。
    HTTP要求を送信する場合、汎用的なHttpClient.SendAsync()を使う方法、シンプルなGetAsync(), PostAsync()等を使う方法があります。ここではシンプルな後者の方法で記載しています。
    public class HomeController : Controller
    {
    
        private readonly IHttpClientFactory _factory;
    
        private readonly ILogger<HomeController> _logger;
    
        public HomeController(
            IHttpClientFactory factory, 
            ILogger<HomeController> logger)
        {
            _factory = factory;
            _logger = logger;
        }
    
        public IActionResult Index()
        {
            return View();
        }
    
        public async Task<IActionResult> DoGet()
        {
            // HTTP要求の実行
            HttpClient client = _factory.CreateClient();
            HttpResponseMessage response = 
                await client.GetAsync("https://localhost:44372/api/ApiTest?param1=abc&param2=xyz");
    
            // ApiTestから取得した応答をテキストとして応答
            return Content(await response.Content.ReadAsStringAsync(), "text/plain");
        }
    
        public async Task<IActionResult> DoPost()
        {
            // フォームデータの作成
            var values = new Dictionary<string, string>();
            values.Add("param1", "123");
            values.Add("param2", "234");
            HttpContent content = new FormUrlEncodedContent(values);
    
            // HTTP要求の実行
            HttpClient client = _factory.CreateClient();
            HttpResponseMessage response =
                await client.PostAsync("https://localhost:44372/api/ApiTest", content);
    
            // ApiTestから取得した応答をテキストとして応答
            string responseBody = await response.Content.ReadAsStringAsync();
            return Content(responseBody, "text/plain");
        }
    
    }
    
  3. 参考:WebAPIのサンプル

    前述のIHttpClientFactory/HttpClientの接続先として使っているWebAPIも載せておきます。
    これらのWebAPIのURLはhttps://localhost:44372/api/ApiTestであり、GET/POSTに対応しています。
    GETの場合、クエリパラメータをJSONに格納して応答します。
    POSTの場合、フォーム内容をJSONに格納して応答します。

    
    [Route("api/[controller]")]
    public class ApiTestController : Controller
    {
        private ILogger<ApiTestController> _logger;
    
        public ApiTestController(ILogger<ApiTestController> logger)
        {
            _logger = logger;
        }
    
        [HttpGet]
        public IActionResult Get([FromQuery]string param1, [FromQuery]string param2)
        {
            _logger.LogDebug("Get() is invoked!");
    
            var dic = new Dictionary<string, string>();
            dic.Add("from", "ApiTest.Get()");
            dic.Add("param1", param1);
            dic.Add("param2", param2);
            return Json(dic);
        }
    
        [HttpPost]
        public IActionResult Post([FromForm]string param1, [FromForm]string param2)
        {
            _logger.LogDebug("Post() is invoked!");
    
            var dic = new Dictionary<string, string>();
            dic.Add("from", "ApiTest.Post()");
            dic.Add("param1", param1);
            dic.Add("param2", param2);
            return Json(dic);
        }
    
    }
    


(adsbygoogle = window.adsbygoogle || []).push({});


(adsbygoogle = window.adsbygoogle || []).push({});

-1. システムエンジニアリング, ASP.NET Core, 実装技術

執筆者:

関連記事

ftp, ftps, sftpの違い

開発対象システムの連携先システムとして、ftpsやらftpsサーバが指定される場合がある。 私の場合、開発標準の役割を担う場合が多く、これらの仕様を把握し、動作確認や単体テスト用のダミーのサーバを用意 …

Webアプリテスト用のHTTPヘッダの追加

フロントに配置されたリバースプロキシサーバやロードバランサで設定されたHTTPヘッダを使用するWebアプリを開発することが多々あります。 このようなシナリオでは、設計に基づいて実装することはできますが …

ASP.NET Core: IHttpClientFactoryの使用方法

ASP.NET Coreや.NET CoreでWebAPIの実行等のHTTP通信を行う場合はHttpClientを使用できますが、HtppClientが想定する利用シナリオを理解して使用しないと、大き …

ASP.NET Core: IHttpClientFactoryのサンプル

前回の記事でIHttpClientFactoryの使用方法を説明しました。 ここでは、サンプルを使用した具体的な使用方法を説明します。 前提 マイクロソフトが推奨するIHttpClientFactor …

DOSバッチリファレンス

ちょっとした事でbatファイルを作成することが多い。 そのたびにネット検索するのが非効率なため、リファレンス化しようと思う。 そういう目的なので、自分がよく調べる項目に絞っている。 開発時の注意点 直 …

プロフィール ゆっきーです。
都内でシステムエンジニアをやっています。
もっと詳細を見る