Web リソースに非同期的にアクセスする
Web リソースを呼び出すと、ユーザーの待機時間が長くなることがあります。 ユーザー インターフェイス (UI) スレッドがブロックされないようにするには、Web リソースに非同期的にアクセスします。
Web リソース
Web リソースは、インターネット経由でアクセスできる任意のデータまたはサービスです。 これには、Web ページ、アプリケーション プログラミング インターフェイス (API)、画像、ビデオ、およびその他の種類のコンテンツが含まれます。 アプリケーションは、ハイパーテキスト転送プロトコル (HTTP) や HTTP セキュア (HTTPS) などの標準の Web プロトコルを使用して Web リソースを取得または操作します。
Web リソースにアクセスするための一般的なユース ケースの 1 つは、リモート サーバーまたはサービスからデータを取得することです。 これには、JSON または XML データのフェッチ、ファイルのダウンロード、Web API の操作が含まれます。 たとえば、天気予報 API にアクセスして特定の場所の現在の気象条件を取得したり、URL から画像をダウンロードしたりできます。
Representational State Transfer (REST) API は、GET、POST、PUT、DELETE などの HTTP メソッドを使用して Web サービスを操作するための標準化された方法を提供するため、Web リソースにアクセスするための一般的な方法です。 REST API は、さまざまなプラットフォーム間でのデータ交換と統合を可能にするために、Web 開発、モバイル アプリケーション、クラウド サービスで広く使用されています。 REST API は通常、JavaScript Object Notation (JSON) 形式でデータを返します。これは軽量で解析が簡単です。
C# では、 HttpClient クラスを使用して Web リソースに HTTP 要求を行うことができます。
非同期 API 呼び出しに HttpClient を使用する
HttpClient クラスは、HTTP 要求を送信し、HTTP 応答を受信するためのクラスを提供する、System.Net.Http名前空間の一部です。
HttpClient クラスは非同期的に使用するように設計されており、Web リソースに対して非ブロッキング呼び出しを行うことができます。
HTTPClient クラスには、次の非同期メソッドが含まれています。
-
GetAsync: 指定した URI に GET 要求を送信し、応答を返します。 -
PostAsync: 指定したコンテンツを持つ指定した URI に POST 要求を送信し、応答を返します。 -
PutAsync: 指定したコンテンツを持つ指定した URI に PUT 要求を送信し、応答を返します。 -
DeleteAsync: 指定した URI に DELETE 要求を送信し、応答を返します。 -
SendAsync: HTTP 要求メッセージを送信し、応答を返します。
次のコード サンプルは、 HttpClient クラスを使用して REST API に対して非同期 GET 要求を行い、応答を処理する方法を示しています。
// Code that demonstrates the use of asynchronous REST API calls in C#
using System;
using System.ComponentModel;
using System.Net.Http;
using System.Threading.Tasks;
using System.Text.Json;
namespace ConsoleApp
{
class Program
{
static async Task Main(string[] args)
{
using (HttpClient client = new HttpClient())
{
try
{
// PetStore API endpoint
string url = "https://petstore.swagger.io/v2/pet/findByStatus?status=available";
HttpResponseMessage response = await client.GetAsync(url);
response.EnsureSuccessStatusCode();
string responseBody = await response.Content.ReadAsStringAsync();
//Console.WriteLine($"Response: {responseBody}");
// Deserialize the JSON response into a list of pets
var pets = JsonSerializer.Deserialize<List<Pet>>(responseBody);
// Iterate through the list of pets and display their details
foreach (var pet in pets)
{
//Console.WriteLine($"Pet ID: {pet.id}, Name: {pet.name}");
if (pet.id.ToString().Length > 4)
{
Console.WriteLine($"Pet ID: {pet.id}, Name: {pet.name}");
}
}
}
catch (HttpRequestException e)
{
Console.WriteLine($"Request error: {e.Message}");
}
}
}
}
}
public class Pet
{
public long id { get; set; }
public string name { get; set; }
public Category category { get; set; }
public List<string> photoUrls { get; set; }
public List<Tag> tags { get; set; }
public string status { get; set; }
}
public class Category
{
public long id { get; set; }
public string name { get; set; }
}
public class Tag
{
public long id { get; set; }
public string name { get; set; }
}
この例では、 HttpClient クラスを使用して、非同期 GET 要求を PetStore API に送信します。 応答は文字列として読み取られ、Pet クラスを使用してJsonSerializer オブジェクトの一覧に逆シリアル化されます。 その後、コードはペットの一覧を反復処理し、その詳細を表示します。
using ステートメントを使用すると、HttpClient インスタンスが使用後に適切に破棄され、保持されているリソースが解放されます。
HttpClient クラスは複数の要求に再利用されるように設計されているため、HttpClientの単一のインスタンスを作成し、アプリケーション全体で使用することをお勧めします。 これにより、基になるネットワーク接続を再利用することで、パフォーマンスとリソース管理を向上させることができます。
概要
このユニットでは、 HttpClient クラスを使用して Web リソースに非同期的にアクセスする方法について説明しました。 また、REST API からデータを取得して応答を処理するための非同期 API 呼び出しを行う方法についても学習しました。 非同期プログラミング手法を使用すると、アプリケーションの応答性を向上させ、ユーザー エクスペリエンスを向上させることができます。
重要なポイント
- WEB リソースには、UI スレッドをブロックしないように非同期的にアクセスできます。
- REST API は、Web サービスと対話するための標準化された方法を提供します。
- C# の
HttpClientクラスは非同期使用用に設計されており、Web リソースへの非ブロッキング呼び出しが可能です。 -
HttpClientクラスには、GetAsync、PostAsync、PutAsync、DeleteAsync、SendAsyncなどの非同期メソッドが含まれています。 - パフォーマンスとリソース管理を向上させるために、
HttpClientの 1 つのインスタンスを複数の要求に再利用する必要があります。