HttpClientとは何か
HttpClientクラス(System.Net.Http)は、C#でHTTP要求を行う場合に利用します。
他にもHTTP要求を行うためのWebClientクラスがありますが、HttpClientを使うことがMicrosoftからも推奨されています。
https://docs.microsoft.com/ja-jp/dotnet/api/system.net.http.httpclient?view=net-6.0
HttpClientの使い方
APIのサンプルを公開しているサイトがあるため、こちらを利用します。
https://www.umayadia.com/Note/Note028WebAPISample.htm
GET
GETの場合は、GetAsync メソッドを使います。
※例に使うAPIのGET仕様は登録されているすべてのデータをJSONで返却します。
using System;
using System.Net.Http;
using System.Threading.Tasks;
var client = new HttpClient();
var result = await client.GetAsync(@"https://umayadia-apisample.azurewebsites.net/api/persons");
var json = await result.Content.ReadAsStringAsync();
Console.WriteLine($"{(int)result.StatusCode} { result.StatusCode }");
Console.WriteLine(json);
以下の通り、JSON文字列で返却されたことが確認できました。
POST
POSTの場合は、Postasync メソッドを使います。
※例に使うAPIのPOST仕様はJSONでpersonオブジェクトを渡して、データを登録します。
using System;
using System.Net.Http;
using System.Threading.Tasks;
using System.Collections.Generic;
using System.Text;
var param = new Dictionary<string, object>()
{
["name"] = "ぺんた",
["note"] = "大阪府出身",
["age"] = 30,
["registerDate"] = "2021-12-01",
};
var jsonString = System.Text.Json.JsonSerializer.Serialize(param);
var content = new StringContent(jsonString, Encoding.UTF8, @"application/json");
//POST
var result = await client.PostAsync(@"https://umayadia-apisample.azurewebsites.net/api/persons", content);
Console.WriteLine($"{(int)result.StatusCode} { result.StatusCode }");
Console.WriteLine(result.StatusCode);
//GET
var resultGet = await client.GetAsync(@"https://umayadia-apisample.azurewebsites.net/api/persons");
var json = await resultGet.Content.ReadAsStringAsync();
Console.WriteLine($"{(int)resultGet.StatusCode} { resultGet.StatusCode }");
Console.WriteLine(json);
POSTした後にGETで登録されているか確認します。
すると、以下の通り登録されていることが確認できました。
HttpClientを使って画像をダウンロード
HttpClientを使って画像をダウンロードする処理を作ってみました。
imgUriに画像パスを、fileNameに保存するファイル名を渡すと、D:Image に保存します。
using System;
using System.IO;
using System.Net.Http;
using System.Threading.Tasks;
public class MyHttpClinet
{
private static HttpClient Client = new HttpClient();
public async Task DownloadImgAsync(string imgUri, string fileName)
{
//GET
var res = await Client.GetAsync(imgUri);
var date = DateTime.Today.ToString("yyyy_MM_dd");
//保存先ディレクトリ
var directory = $@"D:Image{date}";
//存在しなければディレクトリ作成
if (!Directory.Exists(directory))
{
Directory.CreateDirectory(directory);
}
//fileName + .jpg で保存
using (var fileStream = File.Create($@"{directory}{fileName}.jpg"))
{
using (var httpStream = await res.Content.ReadAsStreamAsync())
{
httpStream.CopyTo(fileStream);
}
}
}
}