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
はabstructWebRequest.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に反映してくれるの優しい
参考リンク
- WebRequest周り
- HTML文字列のParse周り
- Async/Await