Search code examples
c#apierror-handlinghttpwebrequesthttpwebresponse

C# Unable to view Errors on API Response just throws an Exception to Try/Catch


I am writing a program to check check if a Voucher number is Valid and I am finding it difficult to extract the Error Message from a REST API which I am working with. C# is pretty new to me as normally VB.net but covering for someone at the moment.

Basically I have a HttpWebReqest and HttpWebResponse objects and using the below code I am making a successful request and getting a response just fine.

When everything goes well there are no problems, but for example if a voucher was invalid or the site was invalid I should get a response saying this, as I do in Postman, see below for example.

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

Instead I get thrown to the Try/Catch.. with the Exception

Error Message Error 422 unprocessable entity,

with no further details or object to check for the real message above?

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;
}

If any one out there has any ideas as to how I can get this working it would be a great help.


Solution

  • The first thing it's better to use HttpClient class instead.

    this code should work for you (if not let me know) :

    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 ";
        }
    }
    

    Usage:

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