【问题标题】:How do I get the body from an HttpWebResponse using Visual Basic (VS2017)如何使用 Visual Basic (VS2017) 从 HttpWebResponse 获取正文
【发布时间】:2018-10-16 22:21:48
【问题描述】:

我在这个项目上玩得很开心,真的可以使用你的帮助。我会尽量保持简洁。
基本上,我有一个 UI 设置来收集用户信息并将REST API 呼叫发送到我的呼叫控制系统。目前它正在处理添加线路、中继线等方面的工作。

问题是我想查看从服务器返回的响应正文。如果我有异常处理查找OK 状态代码并将指示器变为绿色,它会按照我的要求执行。
但是我无法像我在POSTMAN 中发送呼叫时那样给我完整的响应。

这是我在POSTMAN 中收到的回复,我希望在 VB 中进行 API 调用时回复。我得到了一个Status Code 400,里面有这个。

{ "hint": "指定的模式 (2952) 已被线路所有者使用。", “详细信息”:“冲突模式”, “代码”:“P0001”, “消息”:“无效参数”}

我已经尝试了可以​​在此站点上找到的所有搜索条件组合,但似乎没有什么对我有用。我只是不知道我做错了什么。以下是现在如何设置请求/响应的示例。

Try
    '//Setup HTTP connection and modify headers
    Dim APIRequest As HttpWebRequest = HttpWebRequest.Create("https://" & CMIP.Text & "/api/v1/" & Custom_Endpoint_URL.Text)
    APIRequest.Method = "POST"
    APIRequest.Headers.Add("Authorization", "Bearer " + LatestToken.Text)
    APIRequest.ContentType = "application/json"
    'WebCall.Headers.Add("Prefer", "return=representation") 'Only used for testing purposes

    '//Prepare JSON request
    Dim bytearray As Byte() = System.Text.Encoding.UTF8.GetBytes(Custom_Body.Text)
    APIRequest.ContentLength = bytearray.Length

    '//Bypass self-signed cert issue
    ServicePointManager.ServerCertificateValidationCallback = AddressOf AcceptAllCertifications

    '//Load JSON payload into datastream
    Dim datastream As Stream = APIRequest.GetRequestStream()
    datastream.Write(bytearray, 0, bytearray.Length)

    ''//Response
    Dim response As WebResponse = APIRequest.GetResponse
    Dim responsestream As Stream = response.GetResponseStream
    Dim responsereader As New StreamReader(responsestream)
    Dim responsereadstring As String = responsereader.ReadToEnd

    '//Send response to results window
    Response_Box.Text = responsereadstring

Catch ex As WebException

End Try

我想自己解决这个问题,但我已经做了几天了,现在我正要把头撞到墙上。

【问题讨论】:

    标签: json vb.net rest visual-studio-2017


    【解决方案1】:

    当响应的状态码在 4xx 或 5xx 范围内时,HttpWebRequest.GetResponse 方法会抛出 WebException。根据您问题中的信息,您的 API 调用返回的状态代码为 400,因此会触发异常。您的 Catch 块完全为空,因此您默默地忽略了这种情况。 (这就是为什么你永远不应该让你的 Catch 块空着——你永远不会知道有什么东西失败了。)

    原来WebException 类有一个Response 属性(以及Status),所以你可以从那里获取数据。您只需要填写Catch 块:

        Catch ex As WebException
    
            Dim responsestream As Stream = ex.Response.GetResponseStream
            Dim responsereader As New StreamReader(responsestream)
            Dim responsereadstring As String = responsereader.ReadToEnd
            Response_Box.Text = responsereadstring
    
        End Try
    

    【讨论】:

    • 我现在能够捕获成功和不成功的响应。在“400 错误请求”的情况下,我使用该“WebException.Response 属性”来提取我在“邮递员”中获得的相同 JSON 正文,我已将您的答案标记为已接受。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-04
    • 1970-01-01
    相关资源
    最近更新 更多