微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

C# 无法查看 API 响应上的错误只是抛出一个异常来尝试/捕获

如何解决C# 无法查看 API 响应上的错误只是抛出一个异常来尝试/捕获

我正在编写一个程序来检查凭证编号是否有效,但我发现很难从我正在使用的 REST API 中提取错误消息。 C# 对我来说很新,就像通常的 VB.net 一样,但目前正在为某些人提供服务。

基本上我有一个 HttpWebReqestHttpWebResponse 对象,使用下面的代码我可以成功发出请求并得到很好的响应。

如果一切顺利,就没有问题,但例如,如果凭证无效或网站无效,我应该会收到这样的回复,就像我在 Postman 中所做的那样,请参见下面的示例。

{
    "message": "The given data was invalid.","errors": {
        "voucher_no": [
            "Sorry,that voucher number is invalid."
        ]
    }
}

相反,我被抛出到 Try/Catch .. 异常

错误消息错误 422 无法处理的实体,

没有进一步的细节或对象来检查上面的真实消息吗?

try
{
    using (HttpWebResponse response = mywebrequest.GetResponse() as HttpWebResponse)
    {
        if (response.StatusCode != HttpStatusCode.OK)
        {
            // I am unable to get to this part of the Code to process the Error because Try/Catch is executed instead ...
        }
        else
        {
            Stream dataStream1 = response.GetResponseStream();
            StreamReader reader = new StreamReader(dataStream1);
            responseFromServer = reader.ReadToEnd();
        }
    }
}
catch (WebException ex)
{
    msgBox = new MsgBox_UI("Error","Web Server Returned an Error","There is a problem with this Voucher. It may be Expired or invalid at this time.",1,false,28);
    msgBox.ShowDialog();
    break;
}

如果有人对我如何使这项工作有任何想法,那将是一个很大的帮助。

解决方法

这是设计使然,当请求返回“不成功”状态代码时,GetResponse 将抛出 WebException (1)。

  • 您可以检查 Status 上的 WebException 属性以获取状态代码
  • 以及用于网络服务器响应的 Response 属性。
,

首先最好使用 HttpClient 类。

此代码应该对您有用(如果不告诉我):

private async Task<string> GetExtensionToken()
{
    string url = "https://YourApi.com";
    try
    {
        var httpclient = new HttpClient();
        using (HttpResponseMessage response =  httpclient.GetAsync(url).Result)
        {
            using (HttpContent content = response.Content)
            {
                string result =  content.ReadAsStringAsync().Result;
                string Is_Not_Valid = "invalid";
                if (result.Contains(Is_Not_Valid))
                {
                    string token = "Whatever you want to extract if error page" ;
                    return token;
                }
                else
                {
                    string token = "Whatever you want to extract if succeeded" ; return token;
                }
            }
        }
    }
    catch (Exception ex)
    {
        return "Error from catch ";
    }
}

用法:

private async void button1_Click(object sender,EventArgs e)
{
    richTextBox1.Text = await GetExtensionToken();
}
,

好的,所以我接受了上面 Peter 的建议,并决定使用 HttpClient()。

然而,我实际上选择了 Restharp 并将 Nuget 包 RestSharp 安装到我的项目中。 (主要原因是 POSTMAN Code Snippet 给了我使用的确切代码。

然后它就像做梦一样。

我不是在做 Async 所以这是我在添加后发现解决了我的问题

using RestSharp;

var client = new RestClient("https://api.voucherURL.uk/redeem");
client.Timeout = -1;
var request = new RestRequest(Method.POST);
request.AddHeader("Content-Type","application/json");
request.AddHeader("Smart-Auth","sk_xxxxxxxxxxxxxxxxxxxxxxxxxxx");
request.AddHeader("Accept","application/json");
request.AddParameter("application/json","{\n    \"voucher_no\":\"JY584111E3\",\n    \"site_id\": 14\n}",ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
Console.WriteLine(response.Content);

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。