あきちゃんの飽き飽き備忘録

ほぼ死んでるブログ

Http通信のWrapperクラス

初めまして、アキちゃんです。

備忘録をかねてブログを書くことにしました。

今回はIHttpClientFactoryのWrapperクラスついて書きます。

それでは早速・・・IHttpClientFactoryのWrapperクラス!

Lesson.1 事の発端

BlazorでControllerを使用する際に、基本的にはIHttpClientFactoryを使用すると思います。

これを毎回べたに書くと思いのほか記述が多くなるためWrapperクラスを作ろうと思います。

Lesson.2 HttpWrapper

StatusCode等の応答に対する実装は考慮していませんのでそこは別で実装する必要がありますが、値を取得する・設定する等のシンプルな実装は以下となります。

ざっくりこうです。

public class HttpWrapper
{
        IHttpClientFactory ClientFactory;
        public HttpWrapper(IHttpClientFactory clientFactory)
        {
            ClientFactory = clientFactory;
        }
      public async Task<string> AsyncGetString(string uri)
        {
            var request = new HttpRequestMessage(HttpMethod.Get, uri);
            var client = ClientFactory.CreateClient();
            var response = await client.SendAsync(request);
            return await response.Content.ReadAsStringAsync();
        }
      public async Task<byte[]> AsyncGetByteArray(string uri)
        {
            var request = new HttpRequestMessage(HttpMethod.Get, uri);
            var client = ClientFactory.CreateClient();
            var response = await client.SendAsync(request);
            return await response.Content.ReadAsByteArrayAsync();
        }
       
      public async Task AsyncPost(string uri, MultipartFormDataContent content)
        {
            var request = new HttpRequestMessage(HttpMethod.Post, uri);
            var client = ClientFactory.CreateClient();
            {
                request.Content = content;
                await client.SendAsync(request);
            }
        }
}

別段気を付けることはありませんが、String・Binary以外の戻り値を取る際はresponse.Contentの変数を使い分ける必要があります。

またPost通信のContentについては使用する側から用意する実装としています。

Lesson.3 使い方

使い方は、HttpWrapperの変数を宣言しOnInitializedで@injectしたIHttpClientFactoryのインスタンスを引数にnewしてあげます。

@inject IHttpClientFactory ClientFactory
@code {
    HttpWrapper httpWrapper;
   protected override void OnInitialized()
    {
        httpWrapper = new HttpWrapper(ClientFactory);
    }
}

あとは、ControllerのUrlとか送りたいデータをMultipartFormDataContentにして渡してあげれば大丈夫です。

AsyncGetString

var response = await httpWrapper.AsyncGetString($"https://localhost:7272/get");
var getData = JsonSerializer.Deserialize<List<TClass>>(response );

AsyncPost

var content = new MultipartFormDataContent();
content .Add(new StringContent(JsonSerializer.Serialize<List<TClass>>(TClassData.ToList())), "file", "test.json");
await httpWrapper.AsyncPost($"https://localhost:7272/set", content);
content.Dispose();

Lesson.4 あとがき

以上!!