Json 参数在 Vb.net
Json with parameters in Vb.net
我需要将 json 数据发送到 API,包括 QR 码和一些其他值。
这是我从他们那里得到的
需要的参数是:
• JSON 中的参数“数据”:
id -> 100(固定,这是我们软件需要的ID)
二维码 -> 二维码值
示例:data={"id":"100","qrcode":"VL11bbdb186a3a6dcfc57a1b07149c9a0e"}
这是我使用的代码
通话:
Dim jsonPost As New JsonPost(postadress)
Dim dictqr As New Dictionary(Of String, Object)
dictqr.Add("id", lastmeas.id)
dictqr.Add("qrcode", lastmeas.qrcode)
jsonPost.PostData(dictqr)
这是定义
Public Class JsonPost
Private urlToPost As String = ""
Public Sub New(ByVal urlToPost As String)
Me.urlToPost = urlToPost
End Sub
Public Function PostData(ByVal dictData As Dictionary(Of String, Object)) As Boolean
Dim webClient As New WebClient()
Dim resByte As Byte()
Dim resString As String
Dim reqString() As Byte
ServicePointManager.ServerCertificateValidationCallback = Function(o, certificate, chain, errors) True
Try
webClient.Headers("content-type") = "application/json"
webClient.Headers("accept") = "*/*"
reqString = Encoding.Default.GetBytes(JsonConvert.SerializeObject(dictData, Newtonsoft.Json.Formatting.None))
resByte = webClient.UploadData(Me.urlToPost, "POST", reqString)
resString = Encoding.Default.GetString(resByte)
Form1.respuesta_envio = resString
webClient.Dispose()
Return True
Catch ex As Exception
Form1.respuesta_envio = ex.Message
CreateObject("WScript.Shell").Popup(ex.Message, 5, "Data not transfered")
End Try
Return False
End Function
End Class
如果我反序列化,我得到
{"id":"100","qrcode":"example"}
但我不知道如何包含此数据=部分
API 似乎要求您在 form-url-encoded 参数中发送 JSON 字符串。这样设计 API 很不愉快,也不符合逻辑,但如果这是他们的要求,那么您就必须这样做。
因此您需要:
- 删除告诉服务器在请求中期待 JSON body 的 Content-Type header。您实际发送的是 form-url-encoded 数据,其中一个参数恰好在其值中包含 JSON。即删除此行:
webClient.Headers("content-type") = "application/json"
- 将
data=
位添加到 SerializeObject 函数生成的 JSON 字符串中:
reqString = Encoding.Default.GetBytes("data=" & JsonConvert.SerializeObject(dictData, Newtonsoft.Json.Formatting.None))
我需要将 json 数据发送到 API,包括 QR 码和一些其他值。
这是我从他们那里得到的
需要的参数是:
• JSON 中的参数“数据”: id -> 100(固定,这是我们软件需要的ID) 二维码 -> 二维码值
示例:data={"id":"100","qrcode":"VL11bbdb186a3a6dcfc57a1b07149c9a0e"}
这是我使用的代码
通话:
Dim jsonPost As New JsonPost(postadress)
Dim dictqr As New Dictionary(Of String, Object)
dictqr.Add("id", lastmeas.id)
dictqr.Add("qrcode", lastmeas.qrcode)
jsonPost.PostData(dictqr)
这是定义
Public Class JsonPost
Private urlToPost As String = ""
Public Sub New(ByVal urlToPost As String)
Me.urlToPost = urlToPost
End Sub
Public Function PostData(ByVal dictData As Dictionary(Of String, Object)) As Boolean
Dim webClient As New WebClient()
Dim resByte As Byte()
Dim resString As String
Dim reqString() As Byte
ServicePointManager.ServerCertificateValidationCallback = Function(o, certificate, chain, errors) True
Try
webClient.Headers("content-type") = "application/json"
webClient.Headers("accept") = "*/*"
reqString = Encoding.Default.GetBytes(JsonConvert.SerializeObject(dictData, Newtonsoft.Json.Formatting.None))
resByte = webClient.UploadData(Me.urlToPost, "POST", reqString)
resString = Encoding.Default.GetString(resByte)
Form1.respuesta_envio = resString
webClient.Dispose()
Return True
Catch ex As Exception
Form1.respuesta_envio = ex.Message
CreateObject("WScript.Shell").Popup(ex.Message, 5, "Data not transfered")
End Try
Return False
End Function
End Class
如果我反序列化,我得到
{"id":"100","qrcode":"example"}
但我不知道如何包含此数据=部分
API 似乎要求您在 form-url-encoded 参数中发送 JSON 字符串。这样设计 API 很不愉快,也不符合逻辑,但如果这是他们的要求,那么您就必须这样做。
因此您需要:
- 删除告诉服务器在请求中期待 JSON body 的 Content-Type header。您实际发送的是 form-url-encoded 数据,其中一个参数恰好在其值中包含 JSON。即删除此行:
webClient.Headers("content-type") = "application/json"
- 将
data=
位添加到 SerializeObject 函数生成的 JSON 字符串中:
reqString = Encoding.Default.GetBytes("data=" & JsonConvert.SerializeObject(dictData, Newtonsoft.Json.Formatting.None))