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.リクエストの送信
WinHttpSendRequest 関数を利用し、HTTPリクエストを送信します。
リクエストヘッダー、リクエストパラメータを指定します。
6.レスポンスの到着の待機
WinHttpReceiveResponse 関数を利用し、レスポンスの到着を待ちます。
7.ステータスコードの取得
WinHttpQueryHeaders 関数を利用し、ステータスコードを取得します。
ステータスコードの取得においては、InfoLevel引数として、WINHTTP_QUERY_STATUS_CODE | WINHTTP_QUERY_FLAG_NUMBER を指定します。
8.レスポンスデータ問い合わせ
WinHttpQueryDataAvailable 関数を利用し、レスポンスデータ問い合わせを行い、レスポンスデータのサイズを取得します。
9.レスポンスデータ読み込み
WinHttpReadData 関数を利用し、レスポンスデータを読み込みます。

サンプルコード

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

URLの解析からレスポンスデータ読み込みまで

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

ダウンロード

サンプルプロジェクト

関連ページ

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

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