次の方法で共有


チュートリアル: タスクおよび XML HTTP 要求を使用した接続

この例では、IXMLHTTPRequest2 および IXMLHTTPRequest2Callback インターフェイスをタスクと合わせて使って、HTTP GET および POST 要求を Windows ストア アプリケーションの Web サービスに送信する方法を示しています。 タスクと IXMLHTTPRequest2 を組み合わせることによって、他のタスクと共に構成するコードを記述できます。 たとえば、タスクのチェーンの一部としてダウンロード タスクを使用できます。 ダウンロード タスクは、処理が取り消された場合にも応答できます。

ヒント

また、C++ REST SDK を使って、C++ による Windows ストア アプリケーション、またはデスクトップの C++ アプリから HTTP 要求を実行できます。詳細については、「C++ REST SDK (Codename "Casablanca")」を参照してください。

タスクの詳細については、「タスクの並列化 (同時実行ランタイム)」を参照してください。 Windows ストア アプリケーションでのタスクの使用方法の詳細については、「Asynchronous programming in C++」および「C++ における Windows ストア アプリ用の非同期操作の作成」を参照してください。

このドキュメントでは、最初に HttpRequest およびそのサポート クラスを作成する方法を示します。 次に、C++ および XAML を使用する Windows ストア アプリケーションからこのクラスを使用する方法を示します。

このドキュメントで説明している HttpReader クラスを使用する例の詳細については、「JavaScript および C++ での Windows ストア アプリ (Bing Maps Trip Optimizer) の開発」を参照してください。 IXMLHTTPRequest2 を使用し、タスクを使用しないもう 1 つの例については、「Quickstart: Connecting using XML HTTP Request (IXMLHTTPRequest2)」を参照してください。

ヒント

IXMLHTTPRequest2 および IXMLHTTPRequest2Callback は、Windows ストア アプリケーションで使用することをお勧めするインターフェイスです。また、この例をデスクトップ アプリケーションでの使用に適用することもできます。

HttpRequest、HttpRequestBuffersCallback、および HttpRequestStringCallback クラスを定義する

IXMLHTTPRequest2 インターフェイスを使用して HTTP を通じた Web 要求を作成する場合、IXMLHTTPRequest2Callback インターフェイスを実装して、サーバーの応答を受け取り、他のイベントに対応します。 この例では HttpRequest クラスを定義して Web 要求を作成し、HttpRequestBuffersCallbackHttpRequestStringCallback クラスを定義して応答を処理しています。 HttpRequestBuffersCallback および HttpRequestStringCallback クラスは HttpRequest クラスをサポートします。HttpRequest クラスはアプリケーション コードからのみ使用できます。

HttpRequest クラスの GetAsync および PostAsync メソッドを使うと、HTTP GET および POST のそれぞれの操作を開始することができます。 これらのメソッドは、HttpRequestStringCallback クラスを使用して、サーバー応答を文字列として読み取ります。 SendAsyncReadAsync のメソッドは、大きなコンテンツをストリーム転送することができます。 これらの各メソッドは、操作を表す concurrency::task を返します。 The GetAsync および PostAsync のメソッドは task<std::wstring> の値を生成し、wstring の部分がサーバーの応答を表します。 SendAsync および ReadAsync のメソッドは task<void> の値を生成します。これらのタスクは、送信と読み取り操作が完了すると、完了します。

IXMLHTTPRequest2 インターフェイスは非同期に動作するため、この例では concurrency::task_completion_event を使用して、コールバック オブジェクトがダウンロード操作を完了するか、取り消した後に、タスクを作成します。 HttpRequest クラスは、このタスクからタスク ベースの継続を作成し、最終結果を設定します。 HttpRequest クラスは、タスク ベースの継続を使って、前のタスクがエラーを生成したり取り消された場合でも、継続タスクが実行されるようにします。 タスク ベースの継続の詳細については、「タスクの並列化 (同時実行ランタイム)」を参照してください。

取り消し操作をサポートするため、HttpRequestHttpRequestBuffersCallback、および HttpRequestStringCallback のクラスは、キャンセル トークンを使用します。 HttpRequestBuffersCallbackHttpRequestStringCallback クラスは、concurrency::cancellation_token::register_callback メソッドを使用して、タスクの完了イベントが取り消しに応答できるようにします。 この取り消しのコールバックは、ダウンロードを中止します。 取り消し処理の詳細については、「PPL における取り消し処理」を参照してください。

HttpRequest クラスを定義するには

  1. 新しい XAML アプリケーション プロジェクトを作成するには、Visual C++ の [新しいアプリケーション (XAML)] テンプレートを使用します。 この例では、プロジェクトの名前を UsingIXMLHTTPRequest2 とします。

  2. プロジェクトに HttpRequest.h という名前のヘッダー ファイルと HttpRequest.cpp という名前のソース ファイルを追加します。

  3. 次のコードを pch.h に追加します。

  4. 次のコードを HttpRequest.h に追加します。

  5. 次のコードを HttpRequest.cpp に追加します。

Windows ストア アプリで HttpRequest クラスを使用する

このセクションでは、Windows ストア アプリケーションで HttpRequest クラスを使用する方法を示します。 このアプリケーションは、URL リソースを定義する入力ボックス、GET と POST の操作を実行するボタン コマンド、現在の操作を取り消すボタン コマンドを提供します。

HttpRequest クラスを使用するには

  1. MainPage.xaml で、StackPanel 要素を次のように定義します。

  2. MainPage.xaml.h で、この #include ディレクティブを追加します。

  3. MainPage.xaml.h で、これらの private メンバー変数を MainPage クラスに追加します。

  4. MainPage.xaml.h で private メソッド ProcessHttpRequest を宣言します。

  5. MainPage.xaml.cpp で、これらの using ステートメントを追加します。

  6. MainPage.xaml.cpp で、MainPage クラスの GetButton_ClickPostButton_ClickCancelButton_Click メソッドを実装します。

    ヒント

    アプリケーションが取り消しのサポートを必要としない場合は、HttpRequest::GetAsyncHttpRequest::PostAsync のメソッドに concurrency::cancellation_token::none を渡します。

  7. MainPage.xaml.cpp で MainPage::ProcessHttpRequest メソッドを実装します。

  8. プロジェクトのプロパティで、[リンカー] の下の [入力] で、shcore.libmsxml6.libを指定します。

実行中のアプリケーションを次に示します。

実行中の Windows ストア アプリ

次の手順

同時実行ランタイムのチュートリアル

参照

関連項目

task クラス (同時実行ランタイム)

task_completion_event クラス

概念

タスクの並列化 (同時実行ランタイム)

PPL における取り消し処理

C++ における Windows ストア アプリ用の非同期操作の作成

その他の技術情報

Asynchronous programming in C++

Quickstart: Connecting using XML HTTP Request (IXMLHTTPRequest2)

IXMLHTTPRequest2

IXMLHTTPRequest2Callback