アプリケーションから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
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
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
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
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ページを取得するには?
Copyright© Digital Advantage Corp. All Rights Reserved.