連載
» 2005年06月10日 05時00分 公開

.NET TIPS:WebRequest/WebResponseクラスでWebページを取得するには?

[遠藤孝信,デジタルアドバンテージ]
.NET TIPS
Insider.NET


「.NET TIPS」のインデックス

連載目次

 アプリケーションからWebページを取得する場合(HTTPプロトコルのGETメソッドによる取得の場合)、「TIPS:WebClientクラスでWebページを取得するには?」で解説しているようにWebClientクラス(System.Net名前空間)を利用するのが最も簡便だが、ページ取得時により細かな制御を行いたいときにはWebRequestクラス/WebResponseクラス(ともにSystem.Net名前空間)が使用できる。本稿では、これら2つのクラスの基本的な利用方法について解説する。

WebRequest/WebResponseクラスによるWebページの取得

 通常、WebRequestクラスとWebResponseクラスはペアで使用する。

 Webページを取得するには、最初にWebRequestクラスによりWebサーバへ送信するリクエストを作成する。次に、そのGetResponseメソッドを呼び出してWebサーバへのリクエストの送信および、そのレスポンス(応答)の取得を行う。レスポンスを表すクラスがWebResponseクラスである。具体的なコードは次のようになる(C#の場合。VB.NETの場合は下記のサンプル・プログラムを参照)。

WebRequest req = WebRequest.Create(url); // リクエストの作成
WebResponse res = req.GetResponse(); // 送信とレスポンスの取得


 リクエストの作成を行うのにWebRequestクラスをnewによりインスタンス化するのではなく、静的メソッドであるCreateメソッドを呼び出さなくてはならないところに注意が必要だ(これについては後述)。

 このようにして取得したレスポンス(WebResponseオブジェクト)については、そのGetResponseStreamメソッドを呼び出してページ・データに対するストリーム(Streamクラスのオブジェクト)を得ることができる。後はそのストリームからデータを読み出してメモリやファイルに保存するなどすればよい(WebClientクラスではこれらの作業まで行ってくれる)。

 次のサンプル・プログラムは、Google(http://www.google.co.jp/)のトップ・ページにアクセスし、得られたストリームからページ・データをStreamReaderクラス(System.IO名前空間)により文字列として文字列変数に読み込む。

// webreqres1.cs

using System;
using System.IO;
using System.Net;
using System.Text;

public class WebRequestResponse1 {
  static void Main() {

    Encoding enc = Encoding.GetEncoding("Shift_JIS");
    string url = "http://www.google.co.jp/";

    WebRequest req = WebRequest.Create(url);
    WebResponse res = req.GetResponse();

    Stream st = res.GetResponseStream();
    StreamReader sr = new StreamReader(st, enc);
    string html = sr.ReadToEnd();
    sr.Close();
    st.Close();

    Console.WriteLine(html);
  }
}

// コンパイル方法:csc webreqres1.cs

WebRequest/WebResponseクラスによりWebページをダウンロードするC#のサンプル・プログラム(webreqres1.cs)
webreqres1.csのダウンロード

' webreqres1.vb

Imports System
Imports System.IO
Imports System.Net
Imports System.Text

Public Class WebRequestResponse1
  Shared Sub Main()

    Dim enc As Encoding = Encoding.GetEncoding("Shift_JIS")
    Dim url As String = "http://www.google.co.jp/"

    Dim req As WebRequest = WebRequest.Create(url)
    Dim res As WebResponse = req.GetResponse()

    Dim st As Stream = res.GetResponseStream()
    Dim sr As StreamReader = new StreamReader(st, enc)
    Dim html As String = sr.ReadToEnd()
    sr.Close()
    st.Close()

    Console.WriteLine(html)
  End Sub
End Class

' コンパイル方法:vbc /r:System.dll webreqres1.vb

WebRequest/WebResponseクラスによりWebページをダウンロードするVB.NETのサンプル・プログラム(webreqres1.vb)
webreqres1.vbのダウンロード

 GetResponseStreamメソッドによりストリームを取得した場合には、Closeメソッドによりそのストリームを閉じてリソースを解放する必要がある。これにはWebResponseオブジェクトのCloseメソッドを呼び出してもよい。

WebResponseクラスの派生クラスであるHttpWebRequestクラス

 上記のサンプル・プログラムの場合、WebResponseクラスのCreateメソッドが返すオブジェクトは、実際にはWebResponseクラスの派生クラスであるHttpWebRequestクラス(System.Net名前空間)のオブジェクトである。これは、Createメソッドのパラメータで渡されたURLのスキーム名が「http」であるためだ。

 もしURLがファイルの場所を示す「file://」で始まっているならば、Createメソッドは同じくWebResponseクラスの派生クラスであるFileWebRequestクラス(System.Net名前空間)のオブジェクトを返す。このように、WebRequestクラスはさまざまなURLのスキームに対応できるようになっている(.NET Framework 2.0ではFTPに対応したFtpWebRequestクラスが追加される)。

 WebページのURLをCreateメソッドで指定した場合には、その戻り値をHttpWebRequest型にキャストして、それをHttpWebRequestクラスのオブジェクトとして扱うことができる。HTTPプロトコルに固有の機能をリクエストに設定したい場合には、このようなキャストが必要となる。

User-Agentを設定したWebページの取得

 ここではHttpWebRequest型へのキャストが必要となる例として、「TIPS:WebClientクラスでWebページを取得するには?」の最後で行ったような、User-Agentを指定したWebページの取得について取り上げる。

 WebClientクラスではUser-Agentの設定はリクエストのヘッダ(Headersプロパティ)に追加する必要があったが、HttpWebRequestクラスでは独立したUserAgentプロパティにより、その値を設定できる。

 次のサンプル・プログラムでは、WebRequestオブジェクトをHttpWebRequest型にキャストし、UserAgentプロパティを設定してからGoogleのトップ・ページを取得する。この場合に取得されるページの文字コードはUTF-8となる。

// webreqres2.cs

using System;
using System.IO;
using System.Net;
using System.Text;

public class WebRequestResponse2 {
  static void Main() {

    Encoding enc = Encoding.UTF8;
    string url = "http://www.google.co.jp/";

    HttpWebRequest req
      = (HttpWebRequest)WebRequest.Create(url);
    req.UserAgent
      = "Mozilla/4.0 (compatible; MSIE 6.0; Windows XP)";

    WebResponse res = req.GetResponse();

    Stream st = res.GetResponseStream();
    StreamReader sr = new StreamReader(st, enc);
    string html = sr.ReadToEnd();
    sr.Close();
    st.Close();

    Console.WriteLine(html);
  }
}

// コンパイル方法:csc webreqres2.cs

HttpWebRequestクラスを使用したC#のサンプル・プログラム(webreqres2.cs)
webreqres2.csのダウンロード

' webreqres2.vb

Imports System
Imports System.IO
Imports System.Net
Imports System.Text

Public Class WebRequestResponse2
  Shared Sub Main()

    Dim enc As Encoding = Encoding.UTF8
    Dim url As String = "http://www.google.co.jp/"

    Dim req As HttpWebRequest _
      = CType(WebRequest.Create(url), HttpWebRequest)
    req.UserAgent _
      = "Mozilla/4.0 (compatible; MSIE 6.0; Windows XP)"

    Dim res As WebResponse = req.GetResponse()

    Dim st As Stream = res.GetResponseStream()
    Dim sr As StreamReader = new StreamReader(st, enc)
    Dim html As String = sr.ReadToEnd()
    sr.Close()
    st.Close()

    Console.WriteLine(html)
  End Sub
End Class

' コンパイル方法:vbc webreqres2.vb

HttpWebRequestクラスを使用したVB.NETのサンプル・プログラム(webreqres2.vb)
webreqres2.vbのダウンロード

 ちなみに今回の場合、Createメソッドと同様に、WebRequestクラスのGetResponseメソッドが返すオブジェクトは、実際にWebResponseクラスの派生クラスであるHttpWebResponseクラスのオブジェクトである。このため、例えばレスポンスからクッキー(Cookiesプロパティ)を取り出したい場合などは、GetResponseメソッドの戻り値をHttpWebResponse型にキャストしなければならない。

カテゴリ:クラス・ライブラリ 処理対象:ネットワーク
使用ライブラリ:WebRequestクラス(System.Net名前空間)
使用ライブラリ:WebResponseクラス(System.Net名前空間)
使用ライブラリ:StreamReaderクラス(System.IO名前空間)
使用ライブラリ:HttpWebRequestクラス(System.Net名前空間)
使用ライブラリ:HttpWebResponseクラス(System.Net名前空間)
関連TIPS:WebClientクラスでWebページを取得するには?


「.NET TIPS」のインデックス

.NET TIPS

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。