How to get a custom error message from Web Api to jQuery.ajax?

This code uses the Microsoft Web Api Http stack and jQuery.

How do I get a custom error message, created by an HttpError parameter to CreateErrorResponse(), displayed by jQuery’s deferred.fail()?

An example of creating an error response for test purposes in an ApiController:

public HttpResponseMessage Post(Region region)
{
    var error = new HttpError("Failure to lunch.");
    return this.Request.CreateErrorResponse(
               HttpStatusCode.InternalServerError, 
               error);
}

Here’s a cut-down client that’s trying to find the error message to display, “Failure to lunch.”.

$.ajax({
    type: 'POST',
    url: 'api/region',
    contentType: 'application/json; charset=utf-8',
    data: JSON.stringify(region)
})
.fail(function (jqXhr, textStatus, errorThrown) {
    alert(textStatus + ": " + errorThrown + ": " + jqXhr.responseText);
});

What will be displayed is:

“error: Internal Server Error: {full stack here}”

What I want instead is:

“Failure to lunch.”

Answer:

You could parse the responseText string and then use the Message property:

.fail(function (jqXhr, textStatus, errorThrown) {
    if (jqXhr.getResponseHeader('Content-Type').indexOf('application/json') > -1) {
        // only parse the response if you know it is JSON
        var error = $.parseJSON(jqXhr.responseText);
        alert(error.Message);
    } else {
        alert('Fatal error');
    }
});
This is where I’m getting confused. jqXhr.responseText.Message has the error message from the InternalServerError (“An error has occurred.”), not the custom message I put into HttpError. –  Boggin Aug 15 ’13 at 13:15
I made a mistake in my answer. You should use alert(error.Message) instead of alert(error).Message. The Message property will contain the text Failure to lunch.. I have just tested it and it worked fine. Could you show the value of jqXhr.responseText? –  Darin Dimitrov Aug 15 ’13 at 13:18
I was confused, it turns out, because my test case here was throwing another InternalServerError exception which was being returned before my CreateErrorResponse code was being hit. The Web API will comfortably cope with this in the absence of any try..catch code. You’re quite right, the Message property is what I needed. –  Boggin Aug 15 ’13 at 13:33
 
Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s