ありそうで見当たらなかったので、そういうサンプルコードを書いておこうと思いました。
- 同期モードです。非同期モードは少しコードの分量が増えるので見送りました。
- #import使っているので、Visual C++限定です。
#define UNICODE #define _UNICODE #include <iostream> #include <locale> #import <msxml6.dll> int main() { std::locale loc(std::locale::classic(), "", std::locale::ctype); std::wcout.imbue(loc); std::wcerr.imbue(loc); try { _com_util::CheckError(CoInitializeEx( nullptr, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE)); MSXML2::IXMLHTTPRequestPtr xhr(__uuidof(MSXML2::XMLHTTP60)); xhr->open( L"GET", L"https://www.google.co.jp/robots.txt", VARIANT_FALSE); xhr->send(); auto status = xhr->status; if (200 <= status && status <= 299) { std::wcout << xhr->responseText << std::endl; } else { std::wcerr << xhr->status << L' ' << xhr->statusText << std::endl; } CoUninitialize(); // RAII化していないのは手抜き。 } catch (const _com_error& e) { std::wcerr << e.Error() << L' ' << e.ErrorMessage() << std::endl; } } |
対比して理解できるよう、VBScriptとJavaScript(共にWSH)で書いたものも置いてきます。C++版のcatch節に相当する部分を欠いているのはご容赦ください。
Set xhr = CreateObject("Msxml2.XMLHTTP.6.0") xhr.open "GET", "https://www.google.co.jp/robots.txt", False xhr.send If 200 <= xhr.status And xhr.status <= 299 Then WScript.Echo xhr.responseText Else WScript.Echo xhr.status & " " & xhr.statusText End If |
var xhr = new ActiveXObject("Msxml2.XMLHTTP.6.0") xhr.open("GET", "https://www.google.co.jp/robots.txt", false); xhr.send(); if (200 <= xhr.status && xhr.status <= 299) { WScript.Echo(xhr.responseText); } else { WScript.Echo(xhr.status + " " + xhr.statusText); } |
HTTPステータスコードが200番台以外だった場合(else側)はhttpstat.usで試しました。こういう、任意のHTTPステータスコードを試せるウェブサービスはほかにもあるようです。
細かい制御が要らないなら、意外と短いコードになるので、Visual C++で使うのもアリではないかと思いました。
MSDNライブラリのリファレンス: IXMLHTTPRequest Members
スポンサード リンク |
この記事のカテゴリ
- C++ ⇒ XMLHttpRequestをVC++で使う例
- COM ⇒ XMLHttpRequestをVC++で使う例
- JavaScript ⇒ XMLHttpRequestをVC++で使う例
- VC++ ⇒ XMLHttpRequestをVC++で使う例