まずは、WebPay APIに接続するための、リスト2の「Connection.vb」クラスのコードを記述する。ここでは、コードが長くなるため一部掲載を省略している。全てのコードを見る場合は、サンプルをダウンロードして「Connection.vb」ファイルを見ていただきたい。
‘ 今日のネットワークで使用される多くのプロトコルに対し、単純なプログラミング インターフェイスを提供する
‘ System.NET名前空間をインポートする。
Imports System.Net
‘ ASCII および Unicode の文字エンコーディングを表すクラス、文字ブロックとバイト ブロックの相互変換を行う
‘ 抽象基本クラス、および String の中間インスタンスを作成せずに String オブジェクトを操作し書式指定する
‘ ヘルパー クラスが含まれる、System.Text名前空間をインポートする。
Imports System.Text
‘ WebPayApplication.WebPay名前空間を定義する。
Namespace WebPayApplication.WebPay
    Class Connection
‘ 「テスト用APIキー」用のapikeyプロパティを定義する。
        Public Shared Property apiKey() As String
            Get
                Return m_apiKey
            End Get
            Set(value As String)
                m_apiKey = value
            End Set
        End Property
        Private Shared m_apiKey As String
‘ WebPayUriメンバー変数を宣言し、WebPay APIのURLを格納しておく。
        Private Shared WebPayUri As String = "https://api.webpay.jp/v1"
        Public Async Function DoRequest(path As String, method As String, data As String) As Task(Of String)
            Dim request = CreateRequest(path, method)
            Dim bodyBytes = Encoding.UTF8.GetBytes(data)
            Dim stream = Await request.GetRequestStreamAsync()
            stream.Write(bodyBytes, 0, bodyBytes.Length)
            Try
                Using response = Await request.GetResponseAsync()
                    Return ReadStream(response.GetResponseStream())
                End Using
            Catch exception As WebException
                If exception.Response IsNot Nothing Then
                    Dim statusCode = DirectCast(exception.Response, HttpWebResponse).StatusCode
                    Dim message = ReadStream(exception.Response.GetResponseStream())
                    Throw New WebPayException(statusCode, message)
                End If
                Throw
            End Try
        End Function
以降、上記コードの中身を詳細に見ていこう。
まず、非同期処理で行われるためメソッドの先頭にAsyncを追加している。
次に、変数requestに後ほど作成するCreateRequest関数をpathとmethodで初期化した値を参照しておく。変数bodyBytes変数に、指定した文字列に含まれる全ての文字をバイトシーケンスにエンコードして格納する。
GetRequestStreamAsyncメソッドでは、インターネットリソースデータ書き込みのSystem.IO.Streamを非同期操作として返し、その結果を変数streamで参照しておく。
GetResponseAsyncメソッドでは、インターネット要求への応答を非同期操作として受け取り、変数responseで参照しておく。インターネットリソースからデータストリームを返すresponse.GetResponseStreamメソッドを指定した、ReadStream関数の値を戻り値とする。ReadStream関数は後ほど作成する。
例外処理が発生した場合は、応答のステータスや、例外処理のメッセージを表示して、例外をスルーする。
        Private Function CreateRequest(path As String, method As String) As HttpWebRequest
            Dim request = WebRequest.CreateHttp(WebPayUri & path)
            request.Method = method
            SetBasicAuthHeader(request)
            request.ContentType = "application/json"
            Return request
        End Function
CreateHttpで指定したURI文字列である、変数WebPayUriと変数pathを連結して指定し、変数requestで参照しておく。
Methodプロパティに要求に対して使用するメソッドを設定する。後ほど作成するSetBasicAuthHeader関数に変数requestを引数として渡して実行する。
Cotent-Type HTTPヘッダーに「application/json」と指定する。
各種値の設定されたrequest変数を戻り値とする。
        Private Function ReadStream(stream As Stream) As String
            Using reader = New StreamReader(stream, Encoding.UTF8)
                JsonData = reader.ReadToEnd()
                Return JsonData
            End Using
        End Function
StreamとEncoding.UTF8で初期化された新しいStreamReaderのインスタンスreaderオブジェクトを作成する。
後ほど作成するモジュール変数JsonDataに入力したデータによって返されるJSONデータを読み取って格納する。そのモジュール変数JsonDataを戻り値とする。
        Private Sub SetBasicAuthHeader(request As WebRequest)
            Dim authInfo As String = "WebPayページで取得した「テスト用APIキー」"
            authInfo = Convert.ToBase64String(Encoding.UTF8.GetBytes(authInfo))
            request.Headers("Authorization") = "Basic " & authInfo
        End Sub
    End Class
End Namespace
変数authInfoにWebPayページで取得した「テスト用APIキー」を格納する。authInfoの格納している「テスト用APIキー」をUTF8にエンコードされた字列形式に変換してauthInfo変数に格納し、ToBase64Stringで8ビット符号なし整数の配列を、Base64の数字でエンコードされた等価の文字列に変換する。
「Authorization」ヘッダーに文字列「Basic」と変数authInfoの値を連結して指定する。
JSONデータに返される各プロパティを設定するCard.vbクラスを作成する
‘ Jsonを使用するためのクラスの含まれる、Newtonsoft.Json名前空間をインポートする。
Imports Newtonsoft.Json
Namespace WebPayApplication.WebPay
    Class Card
‘ これ以後はJsonPropertyで各属性名を指定して、各プロパティを定義している。
        <JsonProperty("address_country")> _
        Public Property AddressCountry() As String
            Get
                Return m_AddressCountry
            End Get
            Set(value As String)
                m_AddressCountry = value
            End Set
        End Property
        Private m_AddressCountry As String
    End Class
End Namespace
プロパティを定義するコードは省略している。サンプルをダウンロードして参照してほしい。
次に入力したデータと関連付けるJsonPropertyに各属性名を指定して、各プロパティを定義しておくCardRequest.vbクラスを作成する。
Imports Newtonsoft.Json
Namespace WebPayApplication.WebPay
‘ JasonObject属性にTitle:=”card”と指定して、これ以後のプロパティが「card」というTitleで
‘ ひとくくりされるよう指定しておく。
    <JsonObject(Title:="card")> _
    Class CardRequest
        <JsonProperty("number")> _
        Public Property Number() As String
            Get
                Return m_Number
            End Get
            Set(value As String)
                m_Number = value
            End Set
        End Property
        Private m_Number As String
        Friend Function JsonString() As String
            Return JsonConvert.SerializeObject(New With {.card = Me})
        End Function
    End Class
End Namespace
各プロパティの定義は省略している。詳細はサンプルコードを参照してほしい。
JsonConvert.SerializeObjectでは、Titleがcardにひとくくりにされているプロパティを、オブジェクトからJson文字列にシリアライズして、ネットワークで送受信が可能なように変換して、戻り値としている。
Copyright © ITmedia, Inc. All Rights Reserved.