【问题标题】:Send a POST request of JSON content-type and display JSON response in VB.NET发送 JSON 内容类型的 POST 请求并在 VB.NET 中显示 JSON 响应
【发布时间】:2018-07-07 15:53:33
【问题描述】:

我正在尝试向 shapeshift 发送一个 POST 请求,该请求几乎没有要作为 JSON 发送的参数,然后希望在 VB.NET 中显示部分响应

来自 shapeshift 的文档:https://info.shapeshift.io/api#api-9

以下是我到目前为止所尝试的:

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

    Dim request As HttpWebRequest
    Dim response As HttpWebResponse
    Dim reader As StreamReader
    Dim rawresponse As String

    Try

        request = DirectCast(WebRequest.Create("https://shapeshift.io/sendamount"), HttpWebRequest)
        request.ContentType = "application/json"
        request.Method = "POST"

        Dim postdata As String = "{""amount"":}" + TextBox1.Text + "{,""withdrawal"":}" + TextBox2.Text + "{,""pair"":""btc_eth""}" + "{,""returnAddress"":}" + TextBox3.Text
        request.ContentLength = postdata.Length

        Dim requestWriter As StreamWriter = New StreamWriter(request.GetRequestStream())
        requestWriter.Write(postdata)
        requestWriter.Close()

        response = DirectCast(request.GetResponse(), HttpWebResponse)
        reader = New StreamReader(response.GetResponseStream())


        rawresponse = reader.ReadToEnd()

   Catch ex As Exception
        Console.WriteLine(ex.ToString)
   End Try

   Dim json As String = rawresponse
   Dim jsonObject As Newtonsoft.Json.Linq.JObject = Newtonsoft.Json.Linq.JObject.Parse(json)

   Label1.Text = jsonObject("expiration").ToString

End Sub

我得到的错误是:400 Bad Request

我认为这是因为我在解释 JSON POST 请求的代码中搞砸了一些东西。我做了很多研究并尝试了一些东西但没有任何效果:(

【问题讨论】:

    标签: json vb.net post


    【解决方案1】:

    试试这个:

    Dim postdata As String = "{""amount"":" + TextBox1.Text + "},{""withdrawal"":""" + TextBox2.Text + """},{""pair"":""btc_eth""},{""returnAddress"":""" + TextBox3.Text + """}"
    

    您的数据格式不正确。

    或者这里是另一个带有 String.Format 的版本:

    Dim postdata2 As String = String.Format("{{""amount"":{0}}},{{""withdrawal"":""{1}""}},{{""pair"":""btc_eth""}},{{""returnAddress"":""{2}""}}", TextBox1.Text, TextBox2.Text, TextBox3.Text)
    

    【讨论】:

    • 感谢您的解决方案。欣赏它。它给了我一个错误:System.ArgumentNullException HResult=0x80004003 Message=Value 不能为空。参数名称:s Source=mscorlib
    【解决方案2】:

    WebRequest 现在已经很老了。您可能想使用较新的 System.Net.Http.HttpClient,官方文档为here

    此外,在转换为 Json 时,我强烈建议使用 Newtonsoft.Json nuget 包的 JConvert / Deserialize 功能和通用参数 (Of ...) 来转换为预定义的对象。在返回时节省了大量的手动文本解析。

    已经模拟了一个简单的例子:

    Private async Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    
        Dim transaction As New MyRequestData With 
        {
            .Amount = Convert.ToDecimal(TextBox1.Text),
            .Withdrawal = Convert.ToDecimal(TextBox2.Text),
            .ReturnAddress  = TextBox3.Text
        }
    
        Dim content = newtonsoft.Json.JsonConvert.SerializeObject(transaction)
        dim buffer = System.Text.Encoding.UTF8.GetBytes(content)
        Dim bytes = new Net.Http.ByteArrayContent(buffer)
        bytes.Headers.ContentType = new Net.Http.Headers.MediaTypeHeaderValue("application/json")
    
        Dim responseBody As string = nothing
        Using client As New System.Net.Http.HttpClient
            Dim response = Await client.PostAsync("https://shapeshift.io/sendamount",bytes)
            responsebody = Await response.Content.ReadAsStringAsync()
        End Using
    
        Dim data = Newtonsoft.Json.JsonConvert.DeserializeObject(Of MyResponseData)(responsebody)
    
        If data.Expiration Is Nothing
            Label1.Text = data.Error
        Else
            Label1.Text = data.Expiration
        End If
    End Sub
    
    Public class MyRequestData
        Public property Amount As Decimal
        Public property Withdrawal As Decimal
        Public property Pair As String = "btc_eth"
        Public property ReturnAddress As String
    End Class
    
    Public class MyResponseData
        Public property Expiration As String
        Public property [Error] As String
    End Class
    

    希望这会有所帮助,祝你好运!

    【讨论】:

    • 在一定程度上有所帮助。这次我没有收到任何错误,但是 label1.text 没有填充任何内容,所以是空白响应或者我们做错了什么。
    • 我想知道,如果您在 responsebody 变量(作为字符串的响应正文)上放置一个断点,这会给您任何消息内容的指示吗?我希望,在自己尝试并获得带有错误消息的“错误”属性之后,包括它可能会有所帮助,但看看你得到了什么:)
    • info.shapeshift.io/api#api-9这就是我想要达到的目标i.imgur.com/Ek2i1HD.png
    • 哦,对了!好吧,我首先考虑使用该文档示例中列出的其他属性来扩展 MyRequestData + MyResponseData。看看你得到了什么。但重要的是,可能值得将响应视为一个字符串,以确定在将其转换为较低的对象之前返回的内容。
    • 当我在 "responsebody" "{""error"":""Missing a Output Amount or Deposit Amount""}" 上设置断点时,我遇到了一个错误,可以帮助解决这个问题出来,我想我做错了什么。让我试试看。
    猜你喜欢
    • 2013-06-28
    • 2019-02-23
    • 1970-01-01
    • 2015-06-08
    • 1970-01-01
    • 2018-05-27
    • 2015-09-07
    • 1970-01-01
    • 2018-03-20
    相关资源
    最近更新 更多