Webアクセスのテスト

2023年8月2日

いろいろなテスト

https://httpstat.usページは停止されている可能性があります(2023/8/2)

Webアクセスの例外を処理するテスト

例外エラーを考慮しています
非同期処理を実装しています(レスポンス待ちの時、他のボタンなりを押せます)
ちなみに非同期処理を実装していない場合(同期と呼ばれます)
設定するURLは、下記の「テストサーバを使った方法」のURLを指定するといいでしょう

using System;
using System.Net.Http;
using System.Threading.Tasks;

namespace ConsoleApp
{
    class Program
    {
        static async Task Main(string[] args)
        {
            try
            {
                HttpClient client = new HttpClient();
                string url = "https://google.com";
                var response = await client.GetStringAsync(url);
                Console.WriteLine("結果=" + response);
            }
            catch (Exception ex)
            {
                Console.WriteLine("エラーが発生 " + ex.Message);
            }
        }
    }
}

ページの情報を得るサンプル

try
{
    HttpClient client = new HttpClient();
    string url = "https://google.com";
    var response = await client.GetStringAsync(url);
    Console.WriteLine("結果=" + response);
}
catch (Exception ex)
{
    Console.WriteLine("エラーが発生 " + ex.Message);
}

ステータスを得るチェックサンプル

try
{
    HttpClient client = new HttpClient();
    string url = "https://ozuma.sakura.ne.jp/httpstatus/200";
    var response = client.GetAsync(url).Result;
    Console.WriteLine("結果=" + response.StatusCode);
}
catch (Exception ex)
{
    Console.WriteLine("エラーが発生 " + ex.Message);
}

このコードは、C# で書かれた console アプリケーションです。このアプリケーションは、HttpClient クラスを使って HTTP GET リクエストを送信し、Web サーバーから返された文字列を表示することが目的です。

Main メソッドは、async キーワードを使って非同期メソッドとして定義されています。このメソッド内では、HttpClient インスタンスを作成し、指定された URL に対して HTTP GET リクエストを送信するために、GetStringAsync メソッドを呼び出します。このメソッドは、非同期操作を実行して、Web サーバーから返された文字列を返すため、await キーワードを使って呼び出します。

結果を表示するために、返された文字列を使って Console.WriteLine メソッドを呼び出します。このアプリケーションは、何か問題が発生した場合には例外をキャッチすることもできます。例外が発生した場合、catch ブロック内で、ex.Message プロパティを使ってエラー メッセージを表示します。

レスポンス時間を調べるテスト

using System;
using System.Net.Http;
using System.Threading.Tasks;

namespace ConsoleApp
{
    class Program
    {
        static async Task Main(string[] args)
        {
            try
            {
                HttpClient client = new HttpClient();
                string url = "https://httpstat.us/200?sleep=5000";
                var start = DateTime.Now;
                var response = await client.GetStringAsync(url);
                var end = DateTime.Now;

                Console.WriteLine("遅延時間: " + (end - start).TotalMilliseconds + "ms");
                Console.WriteLine("結果=" + response);
            }
            catch (Exception ex)
            {
                Console.WriteLine("エラーが発生 " + ex.Message);
            }
        }
    }
}

このコードは、HTTPクライアントを使用してWeb APIからデータを取得するC# Consoleアプリケーションです。

  1. usingキーワードを使って、必要なライブラリをインポートします。
  2. Programクラスを定義します。
  3. Mainメソッドは非同期メソッドとして定義されており、Web APIからのデータ取得タスクを実行します。
  4. try-catchブロックで例外処理を行います。
  5. HttpClientクラスのインスタンスを生成します。
  6. URLを指定します。
  7. 開始時刻を記録します。
  8. GetStringAsyncメソッドを使ってWeb APIからデータを取得します。
  9. 終了時刻を記録します。
  10. 遅延時間を計算して表示します。
  11. 結果を表示します。
  12. 例外が発生した場合は、エラーメッセージを表示します。

WebからのJsonレスポンスを取得するテスト

コード

学習のため、例外処理を省き、リソース解放コードを追加指定しています
本来、両方実装する方がいいです

using System;
using System.Net.Http;
using System.Text;

namespace HttpClientSample
{
    class Program
    {
        static async Task Main(string[] args)
        {
            using (var client = new HttpClient())
            {
                client.DefaultRequestHeaders.Accept.Clear();
                client.DefaultRequestHeaders.Accept.Add(
                    new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json"));

                var response = await client.GetStringAsync("https://httpstat.us/200");
            }
        }
    }
}

このコードは、C# の HttpClient クラスを使って HTTP GET 要求を送信するサンプルアプリケーションです。

このアプリケーションでは、以下のような流れで HTTP GET 要求を送信します。

  1. HttpClient クラスのインスタンスを作成する。
  2. インスタンスの DefaultRequestHeaders.Accept プロパティをクリアして、application/json を受け取ることを指定する。
  3. client.GetStringAsync メソッドを呼び出して HTTP GET 要求を送信する。このメソッドは、非同期に実行される。
  4. await 演算子を使って非同期操作の結果(HTTP GET のレスポンスボディ)を取得する。

このサンプルアプリケーションでは、指定された URL(https://httpstat.us/200)に対して HTTP GET 要求を送信し、レスポンスボディを取得するだけです。

このコードは、.NET FrameworkにおいてHTTP通信を行うためのHttpClientクラスを使用する際の基本的な構文です。

リソースの解放コードについて

using (var client = new HttpClient()){}

usingキーワードを使用することで、var clientusingブロック内でのみ有効なオブジェクトとなります。これにより、clientが不要になった時点で自動的にリソースが解放されるといったメリットがあります。

var client = new HttpClient()により、新しいHttpClientオブジェクトが作成されます。このオブジェクトは、HTTP通信のために必要な各種情報(エンドポイント、ヘッダー情報など)を持っています。

取得できるJsonレスポンス

{"code":200,"description":"OK"}

整形すると

{
    "code": 200,
    "description": "OK"
}

テストサーバを使うには

上記コードの次の部分のURLにテストしたいサーバアドレスを代入します

string url = "URL";

Webからのレスポンスステータスを正常(200)を返すテスト

https://httpstat.us/200

Webからのレスポンスが5秒遅延するテスト

https://httpstat.us/200?sleep=5000

テストサーバの参考ブログ

その他、多くのレスポンスコードを返すことができるテストサーバです

WindowsFormsアプリで実装する場合のサンプル

最初のコードを変換したものです
例外エラーを考慮しています
非同期処理を実装しています(レスポンス待ちの時、他のボタンなりを押せます)
ちなみに非同期処理を実装していない場合(同期と呼ばれます)、レスポンス待ちの時にはWindowが固まったように見えます)

using System;
using System.Net.Http;
using System.Windows.Forms;

namespace WindowsFormsApp
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private async void button1_Click(object sender, EventArgs e)
        {
            try
            {
                HttpClient client = new HttpClient();
                string url = "https://httpstat.us/200";
                var response = await client.GetStringAsync(url);
                MessageBox.Show("結果=" + response);
            }
            catch (Exception ex)
            {
                MessageBox.Show("エラーが発生 " + ex.Message);
            }
        }
    }
}

汎用性があるように少し変更

これで、GetDataAsyncメソッドは単独のタスクとして分離されました。このタスクは、多くのボタンクリックイベントなどで再利用することができます。

using System;
using System.Net.Http;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApp
{
    public partial class Form1 : Form
    {
        private readonly HttpClient _client = new HttpClient();
        private const string URL = "URL";

        public Form1()
        {
            InitializeComponent();
        }

        private async void button1_Click(object sender, EventArgs e)
        {
            try
            {
                var response = await GetDataAsync();
                MessageBox.Show("結果=" + response);
            }
            catch (Exception ex)
            {
                MessageBox.Show("エラーが発生 " + ex.Message);
            }
        }

        private async Task<string> GetDataAsync()
        {
            return await _client.GetStringAsync(URL);
        }
    }
}