So-net無料ブログ作成
検索選択

MFCでHTTP通信 [プログラミング]

Visual C++でも、(MFCを使えば)HTTP通信をするプログラムを簡単に作ることが出来ます。
(ここ数回、出だしが一緒だ)

こんな感じ

const CString urlStr = _T("http://~~");
try {
    CInternetSession session;

    std::auto_ptr<CStdioFile> file(session.OpenURL(urlStr);
    if (file.get() == NULL)
        return;    // 失敗

    CString str;
    while (file->ReadString(str)) {
        // @@@ 取得したデータを、どうにかする @@@
    }

    file->Close();

} catch (CInternetException* e) {
    e->Delete();
}

ここで不思議なのが、わざわざ最後にClose()をしている事。

この手の後始末は、デストラクタで自動でやってくれるものと思っていたのですが、Close()をし忘れていると、警告が出ます。

Warning: destroying an open CInternetFile with handle ○○○○

警告だし、デストラクタでちゃんとClose()を呼び出してくれているので、無視しても問題ないのですが、気になるなら自分でClose()を呼びましょう。


レスポンスコードは次の様にして取得します。

    CHttpFile* httpFile = dynamic_cast<CHttpFile*>(file.get());
    if (httpFile != NULL)
        return;     // エラー
	
    DWORD code;
    if (!httpFile->QueryInfoStatusCode(code))
        return;     // 失敗

古いVisual C++だとデフォルトでRTTIが無効になっているので(新しい方はデフォルトで有効)、設定を変えるかしましょう。


HTTP通信するには、もう1つ方法があります。

const CString host = _T("~~~");  // ホスト
const CString path = _T("~~~");  // パス

try {
    CInternetSession session;

    std::auto_ptr<CHttpConnection> conn(session.GetHttpConnection(host));
    std::auto_ptr<CHttpFile< file(conn->OpenRequest(CHttpConnection::HTTP_VERB_GET, path));

    if (!file->SendRequest())
        return;    // 失敗
    
    CString str;
    while (file->ReadString(str)) {
        // @@@ 取得したデータを、どうにかする @@@
    }

    file->Close();
    conn->Close();

} catch (CInternetException* e) {
    e->Delete();
}

通信先のURLはホスト名とパスに分割して指定します。
http://example.jp/test.htmlの場合、ホストは“example.jp”、パスは“/test.html”になります。

終わりにClose()が必要なのは、最初の方法と一緒です。忘れると警告が出るのも一緒。


2つ目の方法は、多少面倒なのですが、POSTで通信が可能です。

OpenRequest()で、CHttpConnection::HTTP_VERB_POSTを指定して、SendRequest()で送信する本文を指定します。

[飛行機] 今日の一冊
京伝怪異帖

京伝怪異帖

  • 作者: 高橋 克彦
  • 出版社/メーカー: 中央公論新社
  • 発売日: 2000/06
  • メディア: 単行本

タグ:VisualC++
nice!(0)  コメント(0)  トラックバック(0) 

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0