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

解説

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

ここでは、WinInet API を利用した、HTTP通信のリクエスト送信とレスポンス確認、の方法をまとめます。
WinInet API を利用する方法は、WindowsソケットAPI を利用する方法に比べて、SSL通信(https://~に対する通信)の処理を楽に実装できるという利点があります。
WinInet API を利用する方法は、MFC を利用する方法に比べて、MFC を利用できない、利用したくない場合でも実装できるという利点があります。

準備

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

手続き

1.URLの解析
InternetCrackUrl 関数を利用し、URLを解析し、HTTP通信かHTTPS通信か、通信先ホスト名、通信先URLパス、通信先ポート番号を求めます。
2.WinInetの初期化
InternetOpen 関数を利用し、WinInetの初期化を行います。
インターネットアクセスの方法として、直接アクセスか、プロキシアクセスがあります。インターネットアクセスの方法として、レジストリの設定に従うように、アクセスタイプ引数は、INTERNET_OPEN_TYPE_PRECONFIG を指定します。
3.HTTP接続
InternetConnect 関数を利用し、HTTP接続します。
通信先ホスト名、通信先ポート番号、を引数として指定します。
インターネットサービスタイプ引数は、HTTP通信なので、INTERNET_SERVICE_HTTP を指定します。
4.HTTP接続を開く
HttpOpenRequest 関数を利用し、HTTP接続を開きます。
通信先URLパスを指定します。GETメソッドによる通信の場合には、通信先URLパスの末尾にリクエストパラメータを「&」で連結したものを指定します。
Verb引数は、GETメソッドの場合は、"GET"を、POSTメソッドの場合は、"POST"を指定します。
Flags引数は、HTTPSの場合には、HTTPの場合のフラグに加えて、セキュア通信のためのフラグを指定します。
5.リクエストの送信
HttpSendRequest 関数を利用し、HTTPリクエストを送信します。
リクエストヘッダー、リクエストパラメータを指定します。
6.ステータスコードの取得
HttpQueryInfo 関数を利用し、ステータスコードを取得します。
ステータスコードの取得においては、InfoLevel引数として、HTTP_QUERY_STATUS_CODE | HTTP_QUERY_FLAG_NUMBER を指定します。
7.レスポンスデータ読み込み
InternetReadFile 関数を利用し、レスポンスデータを読み込みます。

サンプルコード

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

ダウンロード

サンプルプロジェクト

関連ページ

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

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