C# HttpClientでAPI通信!GET・POSTリクエストの送り方を初心者向けに徹底解説
生徒
「C#を使って、インターネット上のデータと通信する方法ってありますか?」
先生
「C#では、HttpClientという機能を使うことで、WebサイトやAPIと簡単に通信ができます。」
生徒
「APIとかHttpClientって難しそうですが、初心者でも使えますか?」
先生
「もちろんです!手紙を出すときと同じような感覚で、データを送ったり受け取ったりできる仕組みを見ていきましょう。」
1. HttpClientとは何か?初心者向けの基本知識
プログラミングの世界で、プログラム同士がインターネットを通じて会話をすることをAPI連携や通信と呼びます。例えば、天気予報のWebサイトから今日の天気の情報をもらったり、逆に自分の名前をサーバーに送って登録したりすることです。このとき、C#というプログラム言語で「相手に何かを送る」「相手から何かをもらう」という役割を果たしてくれるのがHttpClient(エイチティーティーピー・クライアント)という部品です。
Webサイトを見るためのブラウザが通信を行うのと同じように、C#のプログラムもHttpClientを使うことで、遠く離れたコンピュータとデータのやり取りが可能になります。まずは、この機能を使うための基本的な準備から学んでいきましょう。
2. HTTPリクエストの基本とGETメソッドの仕組み
HTTPとは、Web上で情報をやり取りするための約束事です。その中で、もっともよく使われるのがGET(ゲット)という指示です。GETは、直訳すると「取得する」という意味で、Webサイトの情報を見たいときや、サーバーからデータをダウンロードしたいときに使います。例えるなら、自動販売機に硬貨を入れて、ボタンを押して飲み物を取り出すようなイメージです。あなたは「飲み物がほしい」という指示を出し、自動販売機がそれに応えて飲み物を渡してくれます。
C#でGETリクエストを送るには、HttpClientのインスタンス(機能の実体)を作成し、GetAsyncメソッドを使います。非同期処理(ひどうきしょり)という言葉が出てきますが、これは「相手から返事が来るまで、他の仕事を止めない」ための重要な仕組みです。通信は時間がかかることがあるので、プログラムがフリーズしないようにこの非同期という技術を使います。
using System;
using System.Net.Http;
using System.Threading.Tasks;
class Program
{
static async Task Main()
{
using (HttpClient client = new HttpClient())
{
string url = "https://jsonplaceholder.typicode.com/posts/1";
HttpResponseMessage response = await client.GetAsync(url);
string content = await response.Content.ReadAsStringAsync();
Console.WriteLine(content);
}
}
}
このコードを実行すると、指定したWebサイトから取得したデータが画面に表示されます。
3. POSTリクエストでサーバーへデータを送ろう
次に、サーバーにデータを送るPOST(ポスト)という方法について学びます。POSTは、Webサイトの問い合わせフォームで内容を入力して送信ボタンを押すときのように、「こちらの情報を相手に渡して処理してもらう」ときに使います。GETが「情報をもらう」ことなら、POSTは「情報を入れる」作業です。
POSTリクエストを送るには、送りたいデータをJSON(ジェイソン)形式という文字列に変換する必要があります。JSONは、コンピュータ同士がデータをやり取りするための共通言語のようなものです。以下のようにして、サーバーへデータを送信します。
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
// 送りたいデータをJSON形式で用意します
string json = "{\"title\": \"foo\", \"body\": \"bar\"}";
HttpContent content = new StringContent(json, Encoding.UTF8, "application/json");
using (HttpClient client = new HttpClient())
{
// 指定したアドレスにデータをPOSTで送信します
HttpResponseMessage response = await client.PostAsync("https://jsonplaceholder.typicode.com/posts", content);
string responseBody = await response.Content.ReadAsStringAsync();
Console.WriteLine(responseBody);
}
これにより、指定したURLに対してあなたのデータを「投稿」することができます。
4. 通信結果のステータスコードを正しく判断する
インターネットの通信では、相手のサーバーが常に正常とは限りません。例えば、Webページが消えていたり、通信が混雑していたりすることもあります。そうしたとき、サーバーはステータスコードという数字を返してきます。これは通信の成功や失敗を知らせるサインです。
もっとも有名なのは「200」という数字で、これは「成功(OK)」を意味します。一方で、よく聞く「404」という数字は「見つかりません」というエラーです。プログラムでは、このステータスコードをチェックして、成功したときだけ次の処理に進むように書くのが基本です。
if (response.IsSuccessStatusCode)
{
Console.WriteLine("通信が成功しました!");
}
else
{
Console.WriteLine("通信が失敗しました。");
}
このように条件分岐を使うことで、プログラムがエラーで止まってしまうことを防げます。
5. HttpClientを効率よく使うためのベストプラクティス
HttpClientを扱う際、ひとつ気をつけるべきことがあります。それは、HttpClientを何度も新しく作り直さないことです。プログラムの世界では「リソースの枯渇(かれかつ)」と呼ばれる問題が起こる可能性があります。HttpClientは、一度作ったらそれをアプリ内で使い回すのが、プロのエンジニアの共通認識です。
初心者のうちはあまり意識しなくて良いかもしれませんが、大きなアプリを作るときには、クラスのフィールド(変数の保存場所)で一度だけ作成するように工夫してみましょう。また、using(ユーザイング)というブロックを使うことで、通信が終わったあとに自動的に後片付けをしてくれるという便利な機能も活用してください。
6. 通信エラーを避けるための安全な書き方
通信は物理的にネットワークケーブルやWi-Fiを経由するため、予期せぬトラブルが起こりがちです。特に「タイムアウト」といって、相手からの返事が遅すぎて待つのを諦めるような事態も起こります。HttpClientにはタイムアウト時間を設定する機能があるので、これを利用してプログラムをより頑丈にしましょう。
client.Timeout = TimeSpan.FromSeconds(10); // 10秒待っても返事がなければ諦める
try
{
var response = await client.GetAsync(url);
}
catch (HttpRequestException e)
{
Console.WriteLine("ネットワークに接続できませんでした。");
}
このように、try-catch(トライキャッチ)という仕組みを使って、エラーが起きたときの対応も書いておくことで、パソコンの初心者でも安心して使えるソフトになります。