CodeZine(コードジン)

特集ページ一覧

MicrosoftのXMLHTTPオブジェクトを使用して他のWebページのデータを取得する

MSXMLによるASPからのデータ取得

  • ブックマーク
  • LINEで送る
  • このエントリーをはてなブックマークに追加
2005/04/01 00:00

他のWebサイトのデータをHTTPリクエスト経由で取得できる商用COMコンポーネントはいろいろあるが、Microsoftも同様のコンポーネントを提供している。

はじめに

 他のWebサイトのデータをHTTPリクエスト経由で取得できる商用COMコンポーネントとしては、AspTearAspHTTPが有名である。しかし、あまり知られていないが、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コンポーネントにはその他のメソッドやプロパティもあるが、このコンポーネントを使用するほとんどの場面、ここで紹介したものだけで十分である。

 実際にいろいろ試してみていただきたい。

参考資料



  • ブックマーク
  • LINEで送る
  • このエントリーをはてなブックマークに追加

著者プロフィール

バックナンバー

連載:japan.internet.com翻訳記事

もっと読む

All contents copyright © 2005-2020 Shoeisha Co., Ltd. All rights reserved. ver.1.5