ごらくらいふ

プログラミングしたりゲームしたり

WPFかじり: HTTP GETする

MSDNのHTTPページにリクエストを飛ばして、レスポンスから適当に表示してみる。

工程を分割

URIからリクエストの発行

var uri = "https://docs.microsoft.com/en-us/dotnet/framework/network-programming/http";
var request = WebRequest.Create(uri);
var response = await request.GetResponseAsync();

response.Close();
  • WebRequestはabstruct
  • WebRequest.Create(string uri)はFactoryで、http(s)部分を見つけるとサブクラスであるHttpWebRequestインスタンスを返却してくれるらしい
  • GetResponseAsync()を発行して初めてリクエストが飛ぶ

レスポンスを取り出す

var stream = response.GetResponseStream();
var reader = new StreamReader(stream);
var responseBody = await reader.ReadToEndAsync();

reader.Close();
  • Responseからはstreamが得られる

HTMLをパースして要素を取り出す

HtmlAgilityPackを使用する

var htmlDoc = new HtmlAgilityPack.HtmlDocument();
htmlDoc.LoadHtml(responseBody);

var title = htmlDoc.DocumentNode.SelectSingleNode("//title");

ViewModel全体コード

public class MainWindowViewModel :INotifyPropertyChanged
{
    private string _text;
    public string Text
    {
        get { return _text; }
        set
        {
            if (_text != value)
            {
                _text = value;
                NotifyPropertyChanged();
            }
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;
    private void NotifyPropertyChanged([CallerMemberName] string propertyName = "")
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }

    public MainWindowViewModel()
    {
        fetchWebSite("https://docs.microsoft.com/en-us/dotnet/framework/network-programming/http");
    }

    private async void fetchWebSite(string uri)
    {
        var request = WebRequest.Create(uri);
        var response = await request.GetResponseAsync();
        var stream = response.GetResponseStream();
        var reader = new StreamReader(stream);
        var responseBody = await reader.ReadToEndAsync();

        var htmlDoc = new HtmlAgilityPack.HtmlDocument();
        htmlDoc.LoadHtml(responseBody);

        var title = htmlDoc.DocumentNode.SelectSingleNode("//title");
        Text = title.InnerHtml;

        reader.Close();
        response.Close();
    }
}

雑感

  • async methodからVMのpropertyをいじってもちゃんとUIに反映してくれるの優しい

参考リンク