RESTful Web サービスの使用

サンプルのダウンロードサンプルのダウンロード

Web サービスをアプリケーションに統合することは一般的なシナリオです。 この記事では、アプリケーションから RESTful Web サービスを使用する方法について Xamarin.Forms 説明します。

Representational State Transfer (REST) は、Web サービスをビルドするためのアーキテクチャ スタイルです。 REST 要求は、Web ブラウザーが Web ページの取得やサーバーへのデータの送信に使用するのと同じ HTTP 動詞を使用して HTTP 経由で実行されます。 次の動詞があります。

  • GET – この操作は、Web サービスからデータを取得するために使用されます。
  • POST – この操作は、Web サービスに新しいデータ項目を作成するために使用されます。
  • PUT – この操作は、Web サービスのデータ項目を更新するために使用されます。
  • PATCH – この操作は、項目の変更方法に関する一連の命令を記述することにより、Web サービスのデータ項目を更新するために使用されます。 この動詞は、サンプル アプリケーションでは使用されていません。
  • DELETE – この操作は、Web サービスのデータ項目を削除するために使用されます。

REST に準拠する Web サービス API は RESTful API と呼ばれ、次のものを使用して定義されます。

  • ベース URI。
  • GET、POST、PUT、PATCH、DELETE などの HTTP メソッド。
  • データのメディアの種類 (JavaScript Object Notation (JSON) など)。

RESTful Web サービスは通常、JSON メッセージを使用してデータをクライアントに返します。 JSON は、コンパクトなペイロードを生成するテキストベースのデータ交換形式です。これにより、データ送信時の帯域幅要件が削減されます。 サンプル アプリケーションでは、オープンソース NewtonSoft JSON.NET ライブラリを使用して、メッセージをシリアル化および逆シリアル化します。

REST のシンプルさが、モバイル アプリケーションで Web サービスにアクセスするための主要な方法となっています。

サンプル アプリケーションを実行すると、次のスクリーンショットに示すように、ローカルでホストされている REST サービスに接続されます。

サンプル アプリケーション

注意

iOS 9 以降では、App Transport Security (ATS) によってインターネット リソース (アプリのバックエンド サーバーなど) とアプリ間のセキュリティで保護された接続が強制され、機密情報が誤って開示されるのを防ぐことができます。 iOS 9 用に構築されたアプリでは ATS が既定で有効になっているため、すべての接続に ATS セキュリティ要件が適用されます。 接続がこれらの要件を満たしていない場合は、例外で失敗します。

インターネット リソースに 対して HTTPS プロトコルとセキュリティで保護された通信を使用できない場合は、ATS をオプトアウトできます。 これは、アプリの Info.plist ファイルを更新することで実現できます。 詳細については、「 App Transport Security」を参照してください。

Web サービスを使用する

REST サービスは、ASP.NET Coreを使用して記述され、次の操作を提供します。

操作 HTTP メソッド 相対 URI パラメーター
To Do アイテムのリストの取得 GET /api/todoitems/
新しい To Do アイテムを作成する POST /api/todoitems/ TodoItem 形式の JSON
To Do アイテムの更新 PUT /api/todoitems/ TodoItem 形式の JSON
To Do アイテムの削除 DELETE /api/todoitems/{id}

URI の大部分には、パスに TodoItem ID が含まれています。 たとえば、ID が の を TodoItem 削除するために、クライアントは 6bb8a868-dba1-4f1a-93b7-24ebce87e243DELETE 要求を に http://hostname/api/todoitems/6bb8a868-dba1-4f1a-93b7-24ebce87e243送信します。 サンプル アプリケーションで使用されるデータ モデルの詳細については、「 データのモデリング」を参照してください。

Web API フレームワークは要求を受け取ると、要求をアクションにルーティングします。 これらのアクションは、 クラス内 TodoItemsController の単なるパブリック メソッドです。 フレームワークでは、ルーティング ミドルウェアを使用して受信要求の URL を照合し、アクションにマップします。 REST API では、HTTP 動詞で表される操作を持つリソースのセットとして、アプリの機能をモデルにルーティングする属性を使用する必要があります。 属性ルーティングでは、属性のセットを使ってアクションをルート テンプレートに直接マップします。 属性ルーティングの詳細については、「 REST API の属性ルーティング」を参照してください。 ASP.NET Coreを使用した REST サービスの構築の詳細については、「ネイティブ モバイル アプリケーション用バックエンド サービスの作成」を参照してください。

クラスは HttpClient 、HTTP 経由で要求を送受信するために使用されます。 これは、HTTP 要求を送信し、URI で識別されたリソースから HTTP 応答を受信するための機能を提供します。 各要求は非同期操作として送信されます。 非同期操作の詳細については、「 非同期サポートの概要」を参照してください。

クラスは HttpResponseMessage 、HTTP 要求が行われた後に Web サービスから受信した HTTP 応答メッセージを表します。 これには、状態コード、ヘッダー、本文など、応答に関する情報が含まれます。 クラスは HttpContent 、 や などの Content-TypeContent-EncodingHTTP 本文ヘッダーとコンテンツ ヘッダーを表します。 コンテンツは、データの形式にReadAs応じて、 や ReadAsByteArrayAsyncなどのReadAsStringAsync任意のメソッドを使用して読み取ることができます。

HTTPClient オブジェクトを作成する

インスタンスは HttpClient 、次のコード例に示すように、アプリケーションが HTTP 要求を行う必要がある限りオブジェクトが存続するようにクラス レベルで宣言されます。

public class RestService : IRestService
{
  HttpClient client;
  ...

  public RestService ()
  {
    client = new HttpClient ();
    ...
  }
  ...
}

データを取得する

メソッドは HttpClient.GetAsync 、次のコード例に示すように、URI で指定された Web サービスに GET 要求を送信し、Web サービスから応答を受信するために使用されます。

public async Task<List<TodoItem>> RefreshDataAsync ()
{
  ...
  Uri uri = new Uri (string.Format (Constants.TodoItemsUrl, string.Empty));
  ...
  HttpResponseMessage response = await client.GetAsync (uri);
  if (response.IsSuccessStatusCode)
  {
      string content = await response.Content.ReadAsStringAsync ();
      Items = JsonSerializer.Deserialize<List<TodoItem>>(content, serializerOptions);
  }
  ...
}

REST サービスは、 プロパティに HTTP 状態コードを HttpResponseMessage.IsSuccessStatusCode 送信して、HTTP 要求が成功したか失敗したかを示します。 この操作では、REST サービスは応答で HTTP 状態コード 200 (OK) を送信します。これは、要求が成功し、要求された情報が応答にあることを示します。

HTTP 操作が成功した場合、応答の内容が読み取られ、表示されます。 プロパティは HttpResponseMessage.Content HTTP 応答の内容を表し、メソッドは HttpContent.ReadAsStringAsync HTTP コンテンツを文字列に非同期的に書き込みます。 その後、このコンテンツは JSON から インスタンスの TodoItemList逆シリアル化されます。

警告

メソッドを ReadAsStringAsync 使用して大きな応答を取得すると、パフォーマンスに悪影響を及ぼす可能性があります。 このような状況では、応答を完全にバッファー処理しないように、応答を直接逆シリアル化する必要があります。

データ

メソッドは HttpClient.PostAsync 、次のコード例に示すように、URI で指定された Web サービスに POST 要求を送信し、Web サービスから応答を受信するために使用されます。

public async Task SaveTodoItemAsync (TodoItem item, bool isNewItem = false)
{
  Uri uri = new Uri (string.Format (Constants.TodoItemsUrl, string.Empty));

  ...
  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);
  }
  ...

  if (response.IsSuccessStatusCode)
  {
    Debug.WriteLine (@"\tTodoItem successfully saved.");
  }
  ...
}

インスタンスは TodoItem 、Web サービスに送信するために JSON ペイロードにシリアル化されます。 その後、このペイロードは、 メソッドを使用して要求が行われる前に Web サービスに送信される HTTP コンテンツの本文に PostAsync 埋め込まれます。

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.TodoItemsUrl, id));
  ...
  HttpResponseMessage response = await client.DeleteAsync (uri);
  if (response.IsSuccessStatusCode)
  {
    Debug.WriteLine (@"\tTodoItem successfully deleted.");
  }
  ...
}

REST サービスは、 プロパティに HTTP 状態コードを HttpResponseMessage.IsSuccessStatusCode 送信して、HTTP 要求が成功したか失敗したかを示します。 この操作の一般的な応答は次のとおりです。

  • 204 (コンテンツなし) – 要求が正常に処理され、応答が意図的に空白になります。
  • 400 (BAD REQUEST) – 要求はサーバーによって認識されません。
  • 404 (NOT FOUND) – 要求されたリソースがサーバー上に存在しません。

ローカル開発

ASP.NET Core Web API などのフレームワークを使用して REST Web サービスをローカルで開発している場合は、Web サービスとモバイル アプリを同時にデバッグできます。 このシナリオでは、iOS シミュレーターと Android エミュレーターのクリア テキスト HTTP トラフィックを有効にする必要があります。 通信を許可するようにプロジェクトを構成する方法については、「 ローカル Web サービスへの接続」を参照してください。