.NET TIPS

WebClientクラスでGETメソッドによりクエリ文字列を送信するには?

デジタルアドバンテージ 遠藤 孝信
2005/06/03

 検索ページなどを利用する場合、クライアント側で入力されたデータは、ページのURLの末尾にクエリ文字列として追加され、Webサーバへ送信される(HTTPプロトコルのGETメソッドが使用されている場合)。クエリ文字列は「?」で始まり、「=」で結ばれた名前と値を「&」で連結したものだ。

 例えばGoogle(http://www.google.co.jp/)で「プログラマ」というキーワードを日本語のページで検索した場合、検索結果が表示されたときのURLは以下のようになる(検索ページを開く条件などにより若干異なることもある)。

http://www.google.co.jp/search?hl=ja&q=%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E&lr=lang_ja

 このURLには、以下の3つの「名前と値」のペアがクエリ文字列として含まれている。

名前
hl ja
q %E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E
lr lang_ja

 ここで、名前「q」に対する値は、「プログラマ」という文字列がURLエンコードされたものだ(URLエンコードについては「TIPS:文字列をURLエンコードするには?」で解説している)。

QueryStringプロパティにより作成可能なクエリ文字列

 アプリケーションからGETメソッドによりGoogleのようなページにリクエストを送る場合、上記のような長いURLを文字列の連結により自前で組み立て、WebClientクラス(System.Net名前空間)を使ってアクセスすることができる(WebClientクラスによるWebページのアクセスについては「TIPS:WebClientクラスでWebページを取得するには?」を参照)。

 しかしWebClientクラスを使用する場合には、そのQueryStringプロパティによりクエリ文字列を指定することも可能だ。

 QueryStringプロパティには、名前と値のペアを格納したNameValueCollectionクラス(System.Collections名前空間)のオブジェクトを指定する(NameValueCollectionクラスについては「TIPS:1つのキー文字列に対して複数の文字列値を保持するには?」を参照)。

 あらかじめQueryStringプロパティを設定しておけば、DownloadDataメソッドやOpenReadメソッドでWebページへアクセスする際にクエリ文字列が生成され、それがURLに追加されることになる。

QueryStringプロパティを使用したサンプル・プログラム

 以下に、Googleで「プログラマ」を検索する、QueryStringプロパティを使用したサンプル・プログラムを示す。

// wcquerystr.cs

using System;
using System.Net;
using System.Text;
using System.Web;
using System.Collections.Specialized;

public class QueryStringSample {
  static void Main() {
    Encoding enc = Encoding.UTF8;

    WebClient wc = new WebClient();

    // GoogleをUTF-8でアクセスするためにUser-Agentを設定
    wc.Headers.Add("User-Agent",
      "Mozilla/4.0 (compatible; MSIE 6.0; Windows XP)");

    NameValueCollection nvc = new NameValueCollection();
    nvc.Add("hl", "ja");
    nvc.Add("q", HttpUtility.UrlEncode("プログラマ", enc));
    nvc.Add("lr", "");

    wc.QueryString = nvc;

    byte[] result =
          wc.DownloadData("http://www.google.co.jp/search");
    string html = enc.GetString(result);

    Console.WriteLine(html);
  }
}

// コンパイル方法:csc wcquerystr.cs
QueryStringプロパティを使用したC#のサンプル・プログラム(wcquerystr.cs)
 
' wcquerystr.vb

Imports System
Imports System.Net
Imports System.Text
Imports System.Web
Imports System.Collections.Specialized

Public Class QueryStringSample
  Shared Sub Main()
    Dim enc As Encoding = Encoding.UTF8

    Dim wc As WebClient = New WebClient()

    ' GoogleをUTF-8でアクセスするためにUser-Agentを設定
    wc.Headers.Add("User-Agent", _
          "Mozilla/4.0 (compatible; MSIE 6.0; Windows XP)")

    Dim nvc As NameValueCollection = new NameValueCollection()
    nvc.Add("hl", "ja")
    nvc.Add("q", HttpUtility.UrlEncode("プログラマ", enc))
    nvc.Add("lr", "")

    wc.QueryString = nvc

    Dim result As byte() = _
          wc.DownloadData("http://www.google.co.jp/search")
    Dim html As String = enc.GetString(result)

    Console.WriteLine(html)
  End Sub
End Class

' コンパイル方法:vbc /r:System.dll /r:System.Web.dll wcquerystr.vb
QueryStringプロパティを使用したVB.NETのサンプル・プログラム(wcquerystr.vb)

 QueryStringプロパティで指定された名前と値は単純に連結されるだけなので、全角文字を含むパラメータ(上記コードの場合には「プログラマ」)などは、あらかじめURLエンコードしておく必要がある。もちろん、Webページで使用される文字コードはあらかじめ調べておかなければならない。End of Article

カテゴリ:クラス・ライブラリ 処理対象:ネットワーク
使用ライブラリ:WebClientクラス(System.Net名前空間)
使用ライブラリ:NameValueCollectionクラス(System.Collections名前空間)
関連TIPS:文字列をURLエンコードするには?
関連TIPS:WebClientクラスでWebページを取得するには?
関連TIPS:1つのキー文字列に対して複数の文字列値を保持するには?
 
この記事と関連性の高い別の.NET TIPS
WebClientクラスでWebページを取得するには?
文字列をURLエンコードするには?
1つのキー文字列に対して複数の文字列値を保持するには?
ClickOnceアプリの起動時にパラメータを渡すには?
WebRequest/WebResponseクラスでPOSTメソッドによりデータを送信するには?
このリストは、(株)デジタルアドバンテージが開発した
自動関連記事探索システム Jigsaw(ジグソー) により自動抽出したものです。
generated by

「.NET TIPS」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間