Back to Top

プログラムの覚書

Category: ネットワーク通信

VB.NET HttpClientでGET要求でデータダウンロード

HttpClientクラスで、GET要求にて指定URL(URI)から非同期でデータをダウンロードする方法を記載します。

・System.Netをインポートする

GetStringAsync()メソッドにて、URL(URI)から文字列としてダウンロードする

Private Async Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    DirectCast(sender, Button).Enabled = False

    Dim url As Uri = New Uri("http://microsoft.com")
    Dim html As String

    Using HttpCl As New HttpClient()
        html = Await HttpCl.GetStringAsync(url)
    End Using

    'ダウンロードしたデータを表示する
    Console.WriteLine(html)

    DirectCast(sender, Button).Enabled = True
End Sub

 

GetByteArrayAsync()メソッドにて、URLからバイナリーデータとしてダウンロードする

Private Async Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    DirectCast(sender, Button).Enabled = False

    Dim url As Uri = New Uri("http://microsoft.com")

    Using HttpCl As New HttpClient()
        Data = Await HttpCl.GetByteArrayAsync(url)
    End Using

    'ダウンロードしたデータを表示する
    Dim str As String = System.Text.Encoding.UTF8.GetString(Data)    'バイト配列を文字列に変換
    Console.WriteLine(str)

    DirectCast(sender, Button).Enabled = True
End Sub

 

GetStreamAsync()メソッドにて、URLからストリームで読み込む

Private Async Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    DirectCast(sender, Button).Enabled = False

    Dim url As Uri = New Uri("http://microsoft.com")
    Dim str As String

    Using HttpCl As New HttpClient()
        Dim dt As System.IO.Stream = Await HttpCl.GetStreamAsync(url)           'データを読み取るStreamを開く
        Dim sr As New System.IO.StreamReader(dt, System.Text.Encoding.UTF8)
        str = sr.ReadToEnd()
        dt.Close()
    End Using

    'ダウンロードしたデータを表示する
    Console.WriteLine(str)

    DirectCast(sender, Button).Enabled = True
End Sub

 

GetAsync()メソッドで、URL(URI)からダウンロードする

Private Async Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    DirectCast(sender, Button).Enabled = False

    Dim url As Uri = New Uri("http://microsoft.com")
    Dim str As String

    Using HttpCl As New HttpClient()
        'ヘッダー部作成
        HttpCl.DefaultRequestHeaders.Add("User-Agent", "Mozilla/5.0 (Windows NT 6.3; Trident/7.0; rv:11.0) like Gecko")
        HttpCl.DefaultRequestHeaders.Add("Accept-Language", "ja-JP")
        HttpCl.Timeout = TimeSpan.FromSeconds(5.0)

        Using response = Await HttpCl.GetAsync(url)
            str = Await response.Content.ReadAsStringAsync()
        End Using
    End Using

    'ダウンロードしたデータを表示する
    Console.WriteLine(str)

    DirectCast(sender, Button).Enabled = True
End Sub

 

VB.NET WebClient asyncとawaitの使い方

 WebClientクラスを使用して async と await の基本的な使い方の説明を記載します。

使用するメソッドは、同期(DownloadString)、非同期(DownloadStringTaskAsync)を使用して説明します。

同期メソッドDownloadString を使用してダウンロード

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Dim url As Uri = New Uri("http://microsoft.com")

    Dim client = New WebClient()

    Debug.WriteLine("--- Start ---")
    Dim s = client.DownloadString(url)
    Debug.WriteLine(s)
    Debug.WriteLine("--- End ---")
End Sub

表示結果は

--- Start ---
<html><head> ・・・(省略)
--- End ---

次に

非同期メソッドDownloadStringTaskAsync を使用してダウンロード

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Dim url As Uri = New Uri("http://microsoft.com")

    Dim client = New WebClient()

    Debug.WriteLine("--- Start ---")
    Dim s = client.DownloadStringTaskAsync(url)
    Debug.WriteLine(s)
    Debug.WriteLine("--- End ---")
End Sub

表示結果

--- Start ---
System.Threading.Tasks.Task`1[System.String]
--- End ---

ダウンロードされた内容が取得できません。

そこで、Async と Await を使用して内容を取得します。

非同期での Async と Awaitの使用方法

Private Async Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Dim url As Uri = New Uri("http://microsoft.com")

    Dim client = New WebClient()

    Debug.WriteLine("--- Start ---")

    Dim task As Task(Of String) = client.DownloadStringTaskAsync(url)
    Debug.WriteLine(task)
    Debug.WriteLine("--- End ---")

    Debug.WriteLine("--- Await Start ---")
    Dim s As String = Await task            'ここで処理待ちをする
    Debug.WriteLine(s)
    Debug.WriteLine("--- Await End ---")
End Sub

表示結果

--- Start ---
System.Threading.Tasks.Task`1[System.String]
--- End ---
--- Await Start ---
<html><head> ・・・省略

--- Await End ---

上記のいらないところを消して簡単にすると

Private Async Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Dim url As Uri = New Uri("http://microsoft.com")

    Dim client = New WebClient()
    Dim s As String = Await client.DownloadStringTaskAsync(url)
    Debug.WriteLine(s)
End Sub