まずは、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.