Representational State Transfer (REST) は、Web サービスを構築するためのアーキテクチャ スタイルです。 REST 要求は通常、Web ブラウザーが Web ページの取得やサーバーへのデータ送信に使用するのと同じ HTTP 動詞を使用して HTTPS 経由で行われます。 動詞は次のとおりです。
- GET – この操作は、Web サービスからデータを取得するために使用されます。
- POST – この操作は、Web サービスでデータの新しい項目を作成するために使用されます。
- PUT – この操作は、Web サービス上のデータ項目を更新するために使用されます。
- PATCH – この操作は、アイテムの変更方法に関する一連の手順を記述することによって、Web サービス上のデータ項目を更新するために使用されます。
- DELETE – この操作は、Web サービス上のデータ項目を削除するために使用されます。
REST に準拠する Web サービス API は、次を使用して定義されます。
- 基本URI。
- GET、POST、PUT、PATCH、DELETE などの HTTP メソッド。
- JavaScript Object Notation (JSON) などのデータのメディアの種類。
REST ベースの Web サービスは、通常、JSON メッセージを使用してクライアントにデータを返します。 JSON は、コンパクトなペイロードを生成するテキストベースのデータ交換形式です。これにより、データ送信時の帯域幅要件が削減されます。 REST のシンプルさが、モバイル アプリで Web サービスにアクセスするための主要な方法となっています。
注
Web サービスにアクセスするには、多くの場合、非同期プログラミングが必要です。 非同期プログラミングの詳細については、「 async および await を使用した非同期プログラミング」を参照してください。
Web サービスの操作
REST サービスの例は、ASP.NET Core を使用して記述され、次の操作を提供します。
| Operation | HTTP メソッド | 相対 URI | パラメーター |
|---|---|---|---|
| todo 項目の一覧を取得する | GET | /api/todoitems/ | |
| 新しい todo 項目を作成する | POST | /api/todoitems/ | JSON 形式の TodoItem |
| todo アイテムを更新する | PUT | /api/todoitems/ | JSON 形式の TodoItem |
| todo アイテムを削除する | DELETE | /api/todoitems/{id} |
.NET MAUI アプリと Web サービスは、 TodoItem クラスを使用して、表示され、ストレージ用に Web サービスに送信されるデータをモデル化します。
public class TodoItem
{
public string ID { get; set; }
public string Name { get; set; }
public string Notes { get; set; }
public bool Done { get; set; }
}
ID プロパティは、各TodoItem オブジェクトを一意に識別するために使用され、更新または削除するデータを識別するために Web サービスによって使用されます。 たとえば、ID がTodoItemaaaabbbb-0000-cccc-1111-dddd2222eeeeを削除するために、.NET MAUI アプリは DELETE 要求をhttps://hostname/api/todoitems/aaaabbbb-0000-cccc-1111-dddd2222eeeeに送信します。
Web API フレームワークは、要求を受信すると、要求をアクションにルーティングします。 これらのアクションは、 TodoItemsController クラスのパブリック メソッドです。 Web API フレームワークでは、ルーティング ミドルウェアを使用して受信要求の URL を照合し、アクションにマップします。 REST API では、属性ルーティングを使用して、HTTP 動詞で表される操作を持つリソースのセットとしてアプリの機能をモデル化する必要があります。 属性ルーティングでは、属性のセットを使ってアクションをルート テンプレートに直接マップします。 属性ルーティングの詳細については、「 REST API の属性ルーティング」を参照してください。 ASP.NET Core を使用した REST サービスの構築の詳細については、「 ネイティブ モバイル アプリケーション用のバックエンド サービスの作成」を参照してください。
HTTPClient オブジェクトを作成する
.NET マルチプラットフォーム アプリ UI (.NET MAUI) アプリは、 HttpClient クラスを使用して Web サービスに要求を送信することで、REST ベースの Web サービスを使用できます。 このクラスは、HTTP 要求を送信し、URI で識別されたリソースから HTTP 応答を受信するための機能を提供します。 各要求は非同期操作として送信されます。
HttpClient オブジェクトは、アプリが HTTP 要求を行う必要がある限り有効になるように、クラス レベルで宣言する必要があります。
public class RestService
{
HttpClient _client;
JsonSerializerOptions _serializerOptions;
public List<TodoItem> Items { get; private set; }
public RestService()
{
_client = new HttpClient();
_serializerOptions = new JsonSerializerOptions
{
PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
WriteIndented = true
};
}
...
}
JsonSerializerOptions オブジェクトは、Web サービスとの間で送受信される JSON ペイロードの書式設定を構成するために使用されます。 詳細については、「 System.Text.Json を使用して JsonSerializerOptions インスタンスをインスタンス化する方法」を参照してください。
データの取得
HttpClient.GetAsync メソッドは、URI で指定された Web サービスに GET 要求を送信し、Web サービスから応答を受信するために使用されます。
public async Task<List<TodoItem>> RefreshDataAsync()
{
Items = new List<TodoItem>();
Uri uri = new Uri(string.Format(Constants.RestUrl, string.Empty));
try
{
HttpResponseMessage response = await _client.GetAsync(uri);
if (response.IsSuccessStatusCode)
{
string content = await response.Content.ReadAsStringAsync();
Items = JsonSerializer.Deserialize<List<TodoItem>>(content, _serializerOptions);
}
}
catch (Exception ex)
{
Debug.WriteLine(@"\tERROR {0}", ex.Message);
}
return Items;
}
データは、web サービスから HttpResponseMessage オブジェクトとして受信されます。 状態コード、ヘッダー、本文など、応答に関する情報が含まれています。 REST サービスは、HTTP 要求が成功したか失敗したかを示すために、 HttpResponseMessage.IsSuccessStatusCode プロパティから取得できる HTTP 状態コードを応答で送信します。 この操作では、REST サービスは応答に HTTP 状態コード 200 (OK) を送信します。これは、要求が成功し、要求された情報が応答にあることを示します。
HTTP 操作が成功した場合、応答の内容が読み取られます。
HttpResponseMessage.Content プロパティは応答の内容を表し、HttpContent型です。
HttpContent クラスは、HTTP 本文とコンテンツ ヘッダー (Content-TypeやContent-Encodingなど) を表します。 その後、string メソッドを使用してコンテンツがHttpContent.ReadAsStringAsyncに読み込まれます。 その後、stringは JSON から List オブジェクトのTodoItemに逆シリアル化されます。
Warnung
ReadAsStringAsyncメソッドを使用して大きな応答を取得すると、パフォーマンスに悪影響を及ぼす可能性があります。 このような状況では、応答を完全にバッファー処理しないように、応答を直接逆シリアル化する必要があります。
データの作成
HttpClient.PostAsync メソッドは、URI で指定された Web サービスに POST 要求を送信し、Web サービスから応答を受信するために使用されます。
public async Task SaveTodoItemAsync(TodoItem item, bool isNewItem = false)
{
Uri uri = new Uri(string.Format(Constants.RestUrl, string.Empty));
try
{
string json = JsonSerializer.Serialize<TodoItem>(item, _serializerOptions);
StringContent content = new StringContent(json, Encoding.UTF8, "application/json");
HttpResponseMessage response = null;
if (isNewItem)
response = await _client.PostAsync(uri, content);
else
response = await _client.PutAsync(uri, content);
if (response.IsSuccessStatusCode)
Debug.WriteLine(@"\tTodoItem successfully saved.");
}
catch (Exception ex)
{
Debug.WriteLine(@"\tERROR {0}", ex.Message);
}
}
この例では、 TodoItem インスタンスは、Web サービスに送信するために JSON ペイロードにシリアル化されます。 このペイロードは、 PostAsync メソッドを使用して要求が行われる前に Web サービスに送信される HTTP コンテンツの本文に埋め込まれます。
REST サービスは、HTTP 要求が成功したか失敗したかを示すために、 HttpResponseMessage.IsSuccessStatusCode プロパティから取得できる HTTP 状態コードを応答で送信します。 この操作の一般的な応答は次のとおりです。
- 201 (CREATED) – 要求の結果、応答が送信される前に新しいリソースが作成されました。
- 400 (BAD REQUEST) – 要求はサーバーによって認識されません。
- 409 (CONFLICT) – サーバー上で競合が発生したため、要求を実行できませんでした。
データの更新
HttpClient.PutAsync メソッドは、URI で指定された Web サービスに PUT 要求を送信し、Web サービスから応答を受信するために使用されます。
public async Task SaveTodoItemAsync(TodoItem item, bool isNewItem = false)
{
...
response = await _client.PutAsync(uri, content);
...
}
PutAsync メソッドの操作は、Web サービスでデータを作成するために使用されるPostAsync メソッドと同じです。 ただし、Web サービスから送信される可能性のある応答は異なります。
REST サービスは、HTTP 要求が成功したか失敗したかを示すために、 HttpResponseMessage.IsSuccessStatusCode プロパティから取得できる HTTP 状態コードを応答で送信します。 この操作の一般的な応答は次のとおりです。
- 204 (コンテンツなし) – 要求が正常に処理され、応答が意図的に空白になります。
- 400 (BAD REQUEST) – 要求はサーバーによって認識されません。
- 404 (NOT FOUND) – 要求されたリソースがサーバーに存在しません。
データの削除
HttpClient.DeleteAsync メソッドは、URI で指定された Web サービスに DELETE 要求を送信し、Web サービスから応答を受信するために使用されます。
public async Task DeleteTodoItemAsync(string id)
{
Uri uri = new Uri(string.Format(Constants.RestUrl, id));
try
{
HttpResponseMessage response = await _client.DeleteAsync(uri);
if (response.IsSuccessStatusCode)
Debug.WriteLine(@"\tTodoItem successfully deleted.");
}
catch (Exception ex)
{
Debug.WriteLine(@"\tERROR {0}", ex.Message);
}
}
REST サービスは、HTTP 要求が成功したか失敗したかを示すために、 HttpResponseMessage.IsSuccessStatusCode プロパティから取得できる HTTP 状態コードを応答で送信します。 この操作の一般的な応答は次のとおりです。
- 204 (コンテンツなし) – 要求が正常に処理され、応答が意図的に空白になります。
- 400 (BAD REQUEST) – 要求はサーバーによって認識されません。
- 404 (NOT FOUND) – 要求されたリソースがサーバーに存在しません。
ローカル開発
ASP.NET Core Web API などのフレームワークを使用して REST Web サービスをローカルで開発している場合は、Web サービスと .NET MAUI アプリを同時にデバッグできます。 このシナリオでは、Android エミュレーターと iOS シミュレーターから HTTP 経由で Web サービスを使用するには、.NET MAUI アプリでクリア テキスト HTTP トラフィックを有効にする必要があります。 詳細については、「 Android エミュレーターと iOS シミュレーターからローカル Web サービスに接続する」を参照してください。
.NET MAUI
サンプルを参照する