japan.internet.comThe Internet & IT Network
RSS
  • ニュース
  • コラム
  • リサーチ
  • ヘッドライン
  • 特集
  • ブログ
  • プレスリリース
  • 専門チャンネル
  • イベント
  • ランキング
  • ニュースメール
2008年10月12日
文字サイズ文字サイズ小文字サイズ中文字サイズ大
デベロッパー コラム2005年10月5日 11:20
4 Guys From Rolla
4 Guys From Rolla japan.internet.com 編集部メールホームrss
米国 Jupitermedia が運営する、ASP と ASP ネットワーク情報に関するサイト。

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

海外海外internet.com発の記事

はじめに

 他の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コンポーネントにはその他のメソッドやプロパティもあるが、このコンポーネントを使用するほとんどの場面、ここで紹介したものだけで十分である。

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

参考資料

著者紹介

Richard Lowe(Richard Lowe)
chadich@yahoo.com
Spherion社(Technology Group)開発サービスコンサルタント。
海外のインターネットコムアメリカ韓国ドイツトルコ
Copyright 2008 Jupitermedia Corporation All Rights Reserved.http://www.internet.com/