IHttpClientの使い方やサンプルの記事を書きましたが、後から見るとちょっと量が多いと感じました。
とりあえず動かしてみたい、概略を知りたい、急いでいる等の人向けに、もっと単純なサンプルを用意してみました。
冒頭の「IHttpClientの使い方やサンプルの記事」については下記をご覧ください。
- ASP.NET Core: IHttpClientFactoryの使用方法
- ASP.NET Core: IHttpClientFactoryのサンプル
- ASP.NET Core: IHttpClientFactoryの検証用サンプル
使い方の要点
- HttpClientを単独で使うと色々な問題があるので、IHttpClientFactoryを使うことを推奨しています。
- IHttpClientFactoryからHttpClientを生成する方法が4つありますが、ここでは最も単純な方法を使います。業務ではこの方法は使わないと思うので、参考としてご覧ください。
- サンプルのプロジェクトや完全なソースコードは下記をご覧ください。GitHubexample-aspdotnet3/basic-example/HttpClientSimpleExample at master · nextdoorwith/example-aspdotnet3
Contribute to nextdoorwith/example-aspdotnet3 development by…
単純なサンプル
ASP.NET CoreのコントローラからIHttpClientFactoryを使ってWebAPIを実行するサンプルになります。
- サービス登録
IHttpClientFactoryを使ってHttpClientクライアントを使う方法は、既定のクライアントを使う方法、名前付きクライアントを使う方法、型付きクライアントを使う方法等があります。
その中で最も単純な「既定のクライアント」を使う場合、次のようにAddHttpClient()を宣言するのみです。123456public void ConfigureServices(IServiceCollection services){services.AddControllersWithViews();services.AddHttpClient();... - GET/POSTの実行
IHttpClientFactoryは「依存関係の注入」で使用するため、コンストラクタの引数で指定します。
HTTP要求を送信する場合、汎用的なHttpClient.SendAsync()を使う方法、シンプルなGetAsync(), PostAsync()等を使う方法があります。ここではシンプルな後者の方法で記載しています。1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950public 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に格納して応答します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | [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); } } |