IHttpClientの使い方やサンプルの記事を書きましたが、後から見るとちょっと量が多いと感じました。
とりあえず動かしてみたい、概略を知りたい、急いでいる等の人向けに、もっと単純なサンプルを用意してみました。
冒頭の「IHttpClientの使い方やサンプルの記事」については下記をご覧ください。
- ASP.NET Core: IHttpClientFactoryの使用方法
- ASP.NET Core: IHttpClientFactoryのサンプル
- ASP.NET Core: IHttpClientFactoryの検証用サンプル
使い方の要点
- HttpClientを単独で使うと色々な問題があるので、IHttpClientFactoryを使うことを推奨しています。
- IHttpClientFactoryからHttpClientを生成する方法が4つありますが、ここでは最も単純な方法を使います。業務ではこの方法は使わないと思うので、参考としてご覧ください。
- サンプルのプロジェクトや完全なソースコードは下記をご覧ください。
単純なサンプル
ASP.NET CoreのコントローラからIHttpClientFactoryを使ってWebAPIを実行するサンプルになります。
- サービス登録
IHttpClientFactoryを使ってHttpClientクライアントを使う方法は、既定のクライアントを使う方法、名前付きクライアントを使う方法、型付きクライアントを使う方法等があります。
その中で最も単純な「既定のクライアント」を使う場合、次のようにAddHttpClient()を宣言するのみです。public void ConfigureServices(IServiceCollection services) { services.AddControllersWithViews(); services.AddHttpClient(); ...
- 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¶m2=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"); } }
参考: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); } }