はじめに
他のWebサイトのデータをHTTPリクエスト経由で取得できる商用COMコンポーネントとしては、AspTearやAspHTTPが有名である。しかし、あまり知られていないが、Microsoftも同様のコンポーネントを提供している。MicrosoftのXML DOM(Document Object Model)コンポーネントスイートには、XMLHTTPオブジェクトが含まれている。XMLHTTPは、もともとリモートサーバー上のXMLドキュメントへのクライアントサイドアクセスをHTTPプロトコルで実現するために開発されたオブジェクトだ。このオブジェクトはリクエスト(POSTSも含む)を送信して、結果のXML、HTMLまたはバイナリデータを取得するための簡単なAPIを公開している。
(注:本稿の執筆時点ではMicrosoftのMSXML 3.0がリリースされたばかりである。これには、Webサーバーやアプリケーションサーバーで使用するためのサーバーサイド用XMLHTTPコンポーネントが含まれている。MSXML 3.0をダウンロードしない限りは前のバージョンを使用することになるが、ほとんどのアプリケーションで問題は発生しないはずだ)
また、Internet Explorerの最新版をインストールしている場合は、おそらくいずれかのバージョンのMSXMLがインストールされているだろう。MSXMLを別途インストールする場合は、最新バージョンのMDACか、MSXMLコンポーネントそのものをインストールできる。MSXMLがインストールされていない場合は、Server.CreateObject("Microsoft.XMLHTTP")
を実行したときにInvalid ProgIDエラーが発生する。
XMLHTTPの基本
XMLHTTPの最も基本的な機能は、Webページ全体のテキストを返すことである。次に例を示す。
<% Response.Buffer = True Dim objXMLHTTP, xml ' Create an xmlhttp object: Set xml = Server.CreateObject("Microsoft.XMLHTTP") ' Or, for version 3.0 of XMLHTTP, use: ' Set xml = Server.CreateObject("MSXML2.ServerXMLHTTP") ' Opens the connection to the remote server. xml.Open "GET", "http://www.4Guysfromrolla.com/", False ' Actually Sends the request and returns the data: xml.Send 'Display the HTML both as HTML and as text Response.Write "<h1>The HTML text</h1><xmp>" Response.Write xml.responseText Response.Write "</xmp><p><hr><p><h1>The HTML Output</h1>" Response.Write xml.responseText Set xml = Nothing %>
このコードでは、4GuysFromRolla.comのデフォルトページ全体を要求側のブラウザに書き出す。responseText
プロパティには、対象ページ全体のテキストが文字列として格納される。
バイナリデータの取得
XMLHTTPオブジェクトを使用してバイナリデータを返すのは非常に簡単である。コードはテキストの場合とほとんど同じだが、符号なしバイトの配列を表すrespondsBody
プロパティを使用する。
<% Response.Buffer = True Dim objXMLHTTP, xml Set xml = Server.CreateObject("Microsoft.XMLHTTP") xml.Open "GET", _ "http://www.4guysfromrolla.com/webtech/code/mitchell-pres.zip", _ False xml.Send ' Add a header to give it a file name: Response.AddHeader "Content-Disposition", _ "attachment;filename=mitchell-pres.zip" ' Specify the content type to tell the browser what to do: Response.ContentType = "application/zip" ' Binarywrite the bytes to the browser Response.BinaryWrite xml.responseBody Set xml = Nothing %>
ここまでは、XMLHTTPを使用して単純なHTMLとバイナリデータを取得する方法を紹介した。次は、データをPOSTする方法と、XMLHTTPを通じて安全なページをリクエストする方法について見ていく。
データのPOST
リモートWebサイトにPOSTリクエストを送信するのも非常に簡単である。次の例では、Webサイト「Internet Movie Database」で映画『The Usual Suspects』を検索している。
<% Response.Buffer = True Dim objXMLHTTP, xml Set xml = Server.CreateObject("Microsoft.XMLHTTP") ' Notice the two changes in the next two lines: xml.Open "POST", "http://www.imdb.com/Find", False xml.Send "select=All&for=The Usual Suspects" Response.Write xml.responseText Set xml = Nothing %>
ここではOpen
メソッドの引数にGET
ではなくPOST
を指定し、Send
メソッドにPOSTデータを指定している。POSTデータの構文はクエリ文字列データの場合とほとんど同じで、文字列の先頭に?を含める必要がないことだけが異なる。POSTできる情報を知るためには、POSTを行うフォームを調べ、どんな要素があり、どんな種類の値を送信するかを調べるしか方法はない。
セキュリティ保護されたサイトへのアクセス
XMLHTTPを使用して、認証の必要なデータにアクセスすることもできる。Open
メソッドには、次の例に示すように、ユーザー名とパスワードをオプションの引数として指定できる。基本認証またはチャレンジレスポンス認証(またはその両方)を有効にしたときのIISの動作と同様に、このユーザー名とパスワードは、資格情報を必要とするWebサイト(WWW-Authenticateヘッダーを使用)にのみ適用される。データベース方式の認証を使用するサイト(HotmailやYahooメールなど)の場合は、ユーザー名とパスワードをその他のデータと同様に単純にPOSTする必要がある。
<% Response.Buffer = True Dim objXMLHTTP, xml Set xml = Server.CreateObject("Microsoft.XMLHTTP") xml.Open "GET", "http://www.4Guysfromrolla.com/", False, _ "Richard", "Welcome" ' Actually Sends the request and returns the data: xml.Send Response.Write xml.responseText Set xml = Nothing %>
Microsoft XMLHTTPコンポーネントにはその他のメソッドやプロパティもあるが、このコンポーネントを使用するほとんどの場面、ここで紹介したものだけで十分である。
実際にいろいろ試してみていただきたい。