公開日:2015/08/08
Web APIにPOSTするのにデータをJSON形式で渡す必要があった。
VB.NETでJSON形式のデータをPOSTする方法をメモする。
データコントラクト
JSONデータをシリアル化および逆シリアル化するとかデータコントラクトの使用を参考に。
JSON形式のデータを生成するのにDataContractJsonSerializerクラスを使うんだけど
そのためにはデータコントラクト(データの定義)なるものを用意する必要があるそう。
DataContractAttribute属性を適用したクラスにDataMemberAttribute属性を適用したメンバーを入れたのがデータコントラクト。
データコントラクト、こんな感じ。
<DataContract> Private Class RequestJson
<DataMember> Public Property test1 As String
<DataMember> Public Property test2 As Integer
End Class
使い方は普通のクラスと同じ。
JSONデータの生成
データコントラクト生成して中身を入れたらシリアライザーでメモリストリームにJSONデータを書き込む。
Dim reqJson As New RequestJson
reqJson.test1 = "aaa"
reqJson.test2 = 123
Dim serializer As New DataContractJsonSerializer(GetType(RequestJson))
Using writeStream As New MemoryStream
serializer.WriteObject(writeStream, reqJson)
End Using
JSONデータを文字列で取り出して表示してみる。
Console.WriteLine(Encoding.UTF8.GetString(writeStream.ToArray()))
できてる。
{"test1":"aaa","test2":123}
数値だとダブルコーテーションつかない。キーの大文字小文字はデータコントラクトのメンバー名が反映される。
POST送信
POSTする時はStringContentに格納してHttpClient.PostAsync。
Dim reqJson As New RequestJson
reqJson.Test1 = "aaa"
reqJson.Test2 = 123
Dim serializer As New DataContractJsonSerializer(GetType(RequestJson))
Using writeStream As New MemoryStream
serializer.WriteObject(writeStream, reqJson)
Using data As New StringContent(Encoding.UTF8.GetString(writeStream.ToArray()), Encoding.UTF8, "application/json"), _
hc As New HttpClient, _
postTask As Task(Of HttpResponseMessage) = hc.PostAsync("https://posttestserver.com/post.php", data)
postTask.Wait()
End Using
End Using
今回も登場、Henry's HTTP Post Dumping Server。ありがたや。
JSONデータを受け取る場合
サーバの戻り値がJSONデータの場合もデータコントラクトを用意しておいてシリアライザーで読み込む。
Using res As HttpResponseMessage = postTask.Result, _
readTask As Task(Of String) = res.Content.ReadAsStringAsync
readTask.Wait()
Using readStream As New MemoryStream(Encoding.UTF8.GetBytes(readTask.Result()))
Dim reader As New DataContractJsonSerializer(GetType(ResponseJson))
Dim json As ResponseJson = CType(reader.ReadObject(readStream), ResponseJson)
End Using
End Using
この1ヶ月間でつくったプログラムの中にメモしておきたいことがかなり貯まってる。
少しずつ書き出してこう_(:3 」∠)_