HTTP通信のリクエスト送信とレスポンス確認(WinHTTP API使用)(非同期通信)

解説

HTTP通信を実装する方法としては、WindowsソケットAPI を利用する方法、WinINet API を利用する方法、WinHTTP API を利用する方法、MFC を利用する方法、などがあります。

ここでは、WinHTTP API を利用した、HTTP通信のリクエスト送信とレスポンス確認、の方法をまとめます。

WinINet API および WinHTTP API を利用する方法は、WindowsソケットAPI を利用する方法に比べて、SSL通信(https://~に対する通信)の処理を楽に実装できるという利点があります。
WinINet API および WinHTTP API を利用する方法は、MFC を利用する方法に比べて、MFC を利用できない、利用したくない場合でも実装できるという利点があります。

WinHTTP API を利用する方法は、WinINet API を利用する方法に比べて、非同期通信(同期通信ではデータ通信のリクエストを出してからレスポンスが来るまでほかの処理を行わずにレスポンスを待ち続けます。非同期通信ではレスポンスを待っている間にほかの処理を行います。)の処理を楽に実装できるという利点があります。

ここでは、非同期通信の処理の実装方法をまとめます。

準備

・Winhttp.h のインクルード
#include <Winhttp.h>
をファイルヘッダー部等に追加します。
これにより、WinHTTP APIが使えるようになります。
・Winhttp.lib のリンク
#pragma comment( lib, "Winhttp.lib" )
をファイルヘッダー部に記述することにより、Winhttp.lib をリンクするファイルへ追加します。
これにより、WinHTTP APIがリンクされるようになります。
(リンクするファイルの追加の方法には、#pragma comment( lib, libファイル名 ) をソースに記述する方法の他にも、プロジェクトのプロパティ「構成プロパティ > リンカ > 入力 > 追加の依存ファイル」に libファイル名 を追記する方法、などもあります。)

手続き

1.セッションオブジェクトの作成
WinHttpOpen 関数を利用し、セッションオブジェクトを作成します。
ユーザーエージェント名、プロキシ設定、プロキシ名、プロキシバイパス名、を引数として指定します。
WinHttpGetIEProxyConfigForCurrentUser 関数を利用すると、Internet Explorer のプロキシ設定を取得することができます。
2.URLの解析
WinHttpCrackUrl 関数を利用し、URLを解析し、HTTP通信かHTTPS通信か、通信先ホスト名、通信先URLパス、通信先ポート番号を求めます。
3.HTTP接続
WinHttpConnect 関数を利用し、HTTP接続を行います。
通信先ホスト名、通信先ポート番号、を引数として指定します。
4.HTTP接続を開く
WinHttpOpenRequest 関数を利用し、HTTP接続を開きます。
通信先URLパスを指定します。GETメソッドによる通信の場合には、通信先URLパスの末尾にリクエストパラメータを「&」で連結したものを指定します。
Verb引数は、GETメソッドの場合は、"GET"を、POSTメソッドの場合は、"POST"を指定します。
Flags引数は、HTTPの場合には ゼロ を、HTTPSの場合には WINHTTP_FLAG_SECURE を、指定します。
5.コールバック関数の設定
WinHttpSetStatusCallback 関数を利用し、コールバック関数を設定します。
fnInternetCallback 引数に、コールバック関数を指定します。
NotificationFlag 引数に、通知を受け取りたいステータスを指定します。
6.リクエストの送信
WinHttpSendRequest 関数を利用し、HTTPリクエストを送信します。
リクエストヘッダー、リクエストパラメータを指定します。
7.コールバック関数でステータス毎の処理
コールバック関数で、ステータス毎の処理をします。
・WINHTTP_CALLBACK_STATUS_SENDREQUEST_COMPLETE
 WinHttpReceiveResponse 関数を利用し、レスポンスの到着を待機します。
・WINHTTP_CALLBACK_STATUS_HEADERS_AVAILABLE
 WinHttpQueryHeaders 関数を利用し、ステータスコードを取得します。
 WinHttpQueryDataAvailable 関数を利用し、最初のレスポンスデータの問い合わせを行います。
・WINHTTP_CALLBACK_STATUS_DATA_AVAILABLE
 WinHttpReadData 関数を利用し、レスポンスデータを読み込みを開始します。
・WINHTTP_CALLBACK_STATUS_READ_COMPLETE
 読み込んだレスポンスデータをバッファ等にコピーします。
 WinHttpQueryDataAvailable 関数を利用し、次のレスポンスデータの問い合わせを行います。

サンプルコード

セッションオブジェクトの作成部

URLの解析からリクエスト送信まで

コールバック関数でステータス毎の処理

サンプルコードアプリケーション実行結果

ダウンロード

サンプルプロジェクト

関連ページ

HTTP通信のリクエスト送信とレスポンス確認(WinInet API使用)

HTTP通信のリクエスト送信とレスポンス確認(WinHTTP API使用)(同期通信)