SIN@SAPPOROWORKSの覚書

C#を中心に、夜な夜な試行錯誤したコードの記録です。

HttpWebRequestによる軽易なHTTPデータ受信 (C#)(F#)


System.Net.WebRequestを利用すると、軽易にHTTPでデータを取得できます。
サンプルでは、HTTPリクエストと同レスポンスのヘッダを列挙表示しています。

受信したデータの本体を取得する場合はHttpWebResponsのGetResponseStream()でストリームを生成しこれを読み取ることになりますが、この際、適切なエンコードが必要になります。

エンコードの種類は、HttpWebResponsのCharacterSetプロパティに設定されているはずですが、これが、正確でない場合があります。うまく取得できなかった場合は、受信データ(HTML)本体の中を開いてヘッダなどを解釈する必要があるかも知れません。


C#サンプル

using System;
using System.Net;

namespace Examlpe {
    class Program {
        static void Main(string[] args) {


            //HTTPリクエスト
            var req = HttpWebRequest.Create("http://www.google.co.jp/");
            req.Timeout = 15000;//タイムアウト(15秒)
            //HTPレスポンス
            var res = (HttpWebResponse)req.GetResponse();

            //ヘッダ取得
            Console.WriteLine("");
            Console.WriteLine("[SEND]");
            var h = req.Headers;
            for (int i = 0; i < h.Count;i++ ) {
                Console.WriteLine("{0}: {1}", h.GetKey(i),h[i]);
            }

            //ヘッダ取得
            Console.WriteLine("");
            Console.WriteLine("[RECV]");
            h = res.Headers;
            for (int i = 0; i < h.Count; i++) {
                Console.WriteLine("{0}: {1}", h.GetKey(i), h[i]);
            }
            Console.WriteLine();
            Console.WriteLine("何かのキーを押してください。");
            Console.ReadKey();
        }
    }
}

F#サンプル

open System
open System.Net

//ヘッダ取得
let getHeaders (h:WebHeaderCollection) =
    [0..h.Count-1]
    |>Seq.map(fun i-> h.GetKey(i),h.[i])

//HTTPリクエスト
let req = HttpWebRequest.Create("http://www.google.co.jp/")
req.Timeout <- 15000 //タイムアウト(15秒)
//HTPレスポンス
let res = req.GetResponse():?>HttpWebResponse

printfn ""
printfn "[SEND]"
getHeaders(req.Headers)|>Seq.iter(fun(k,v)->printfn "%s: %s" k v)

printfn ""
printfn "[RECV]"
getHeaders(res.Headers)|>Seq.iter(fun(k,v)->printfn "%s: %s" k v)

printfn ""
printfn "何かのキーを押してください。"
Console.ReadKey() |> ignore