チュートリアル: タスクおよび 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 要求を作成し、HttpRequestBuffersCallback と HttpRequestStringCallback クラスを定義して応答を処理しています。 HttpRequestBuffersCallback および HttpRequestStringCallback クラスは HttpRequest クラスをサポートします。HttpRequest クラスはアプリケーション コードからのみ使用できます。
HttpRequest クラスの GetAsync および PostAsync メソッドを使うと、HTTP GET および POST のそれぞれの操作を開始することができます。 これらのメソッドは、HttpRequestStringCallback クラスを使用して、サーバー応答を文字列として読み取ります。 SendAsync と ReadAsync のメソッドは、大きなコンテンツをストリーム転送することができます。 これらの各メソッドは、操作を表す concurrency::task を返します。 The GetAsync および PostAsync のメソッドは task<std::wstring> の値を生成し、wstring の部分がサーバーの応答を表します。 SendAsync および ReadAsync のメソッドは task<void> の値を生成します。これらのタスクは、送信と読み取り操作が完了すると、完了します。
IXMLHTTPRequest2 インターフェイスは非同期に動作するため、この例では concurrency::task_completion_event を使用して、コールバック オブジェクトがダウンロード操作を完了するか、取り消した後に、タスクを作成します。 HttpRequest クラスは、このタスクからタスク ベースの継続を作成し、最終結果を設定します。 HttpRequest クラスは、タスク ベースの継続を使って、前のタスクがエラーを生成したり取り消された場合でも、継続タスクが実行されるようにします。 タスク ベースの継続の詳細については、「タスクの並列化 (同時実行ランタイム)」を参照してください。
取り消し操作をサポートするため、HttpRequest、HttpRequestBuffersCallback、および HttpRequestStringCallback のクラスは、キャンセル トークンを使用します。 HttpRequestBuffersCallback と HttpRequestStringCallback クラスは、concurrency::cancellation_token::register_callback メソッドを使用して、タスクの完了イベントが取り消しに応答できるようにします。 この取り消しのコールバックは、ダウンロードを中止します。 取り消し処理の詳細については、「PPL における取り消し処理」を参照してください。
HttpRequest クラスを定義するには
新しい XAML アプリケーション プロジェクトを作成するには、Visual C++ の [新しいアプリケーション (XAML)] テンプレートを使用します。 この例では、プロジェクトの名前を UsingIXMLHTTPRequest2 とします。
プロジェクトに HttpRequest.h という名前のヘッダー ファイルと HttpRequest.cpp という名前のソース ファイルを追加します。
次のコードを pch.h に追加します。
次のコードを HttpRequest.h に追加します。
次のコードを HttpRequest.cpp に追加します。
Windows ストア アプリで HttpRequest クラスを使用する
このセクションでは、Windows ストア アプリケーションで HttpRequest クラスを使用する方法を示します。 このアプリケーションは、URL リソースを定義する入力ボックス、GET と POST の操作を実行するボタン コマンド、現在の操作を取り消すボタン コマンドを提供します。
HttpRequest クラスを使用するには
MainPage.xaml で、StackPanel 要素を次のように定義します。
MainPage.xaml.h で、この #include ディレクティブを追加します。
MainPage.xaml.h で、これらの private メンバー変数を MainPage クラスに追加します。
MainPage.xaml.h で private メソッド ProcessHttpRequest を宣言します。
MainPage.xaml.cpp で、これらの using ステートメントを追加します。
MainPage.xaml.cpp で、MainPage クラスの GetButton_Click、 PostButton_Click、 CancelButton_Click メソッドを実装します。
ヒント
アプリケーションが取り消しのサポートを必要としない場合は、HttpRequest::GetAsync と HttpRequest::PostAsync のメソッドに concurrency::cancellation_token::none を渡します。
MainPage.xaml.cpp で MainPage::ProcessHttpRequest メソッドを実装します。
プロジェクトのプロパティで、[リンカー] の下の [入力] で、shcore.lib と msxml6.libを指定します。
実行中のアプリケーションを次に示します。
次の手順
参照
関連項目
概念
C++ における Windows ストア アプリ用の非同期操作の作成
その他の技術情報
Asynchronous programming in C++
Quickstart: Connecting using XML HTTP Request (IXMLHTTPRequest2)