Roy Tsabari
Roy Tsabari

Reputation: 2040

How to get response data in error from AJAX response?

I've created the server REST API to return a response with HTTP code and a JSON (or XML) object with more details: application code (specific to scenario, message that describe what happened etc.).

So, for example, if a client sends a Register request and the password is too short, the response HTTP code will be 400 (Bad Request), and the response data will be: {appCode : 1020 , message : "Password is too short"}.

In jQuery, I'm using the "AJAX" function to create a POST request. When the server returns something different from HTTP code 200 (OK), jQuery defines it as "error".

The error handler can get 3 parameters: jqXHR, textStatus, errorThrown. How can I get the JSON object that is sent by the server in an error case?

  1. Here is my JavaScript code:

    function register (userName, password) {
        var postData = {};
        postData["userName"] = userName;
        postData["password"] = password;
    
        $.ajax ({
            dataType: "json",
            type: "POST",
            url: "<server>/rest/register",
            data: postData,
            success: function(data) {
                showResultSucceed(data);
                hideWaitingDone();
            },
            error: function (jqXHR, textStatus, errorThrown) {
    
                showResultFailed(jqXHR.responseText);
                hideWaitingFail();
            }
        })
    }
    
  2. When looking at Firebug console, it seems like the response is empty. When invoking the same request by using REST testing tool, I get a response with JSON object it it.

What am I doing wrong?

Upvotes: 70

Views: 88798

Answers (3)

mpen
mpen

Reputation: 282875

Here's an example of how you get JSON data on error:

$.ajax({
    url: '/path/to/script.php',
    data: {'my':'data'},
    type: 'POST',
    dataType: 'json'
}).fail(function($xhr) {
    var data = $xhr.responseJSON;
    console.log(data);
});

From the docs:

If json is specified, the response is parsed using jQuery.parseJSON before being passed, as an object, to the success handler. The parsed JSON object is made available through the responseJSON property of the jqXHR object.

Otherwise, if responseJSON is not available, you can try $.parseJSON($xhr.responseText).

Upvotes: 67

Archit Sanghvi
Archit Sanghvi

Reputation: 59

I also faced same problem when i was using multipart/form-data. At first I thought multipart/form-data created this mess, but later i found the proper solution.

1) JS code before:

var jersey_url = "http://localhost:8098/final/rest/addItem/upload";
var ans = $.ajax({
    type: 'POST',
    enctype: 'multipart/form-data',
    url: jersey_url,
    data: formData,
    dataType: "json",
    processData: false,
    contentType: false 
    success : funtion(data){
      var temp = JSON.parse(data);
      console.log("SUCCESS : ", temp.message);  
    }
    error : funtion($xhr,textStatus,errorThrown){
       console.log("ERROR : ", errorThrown);
       console.log("ERROR : ", $xhr);
       console.log("ERROR : ", textStatus);
    }
    });

Here when error occurred, it showed me this in console :-
Error :
Error : { abort : f(e), always : f(), .... , responseJSON :"{"message":"failed"}" }
Error : error

Thus i came to know that we have to use $xhr.responseJSON to get the string message which we sent from rest api.

2) modified/working error funtion:

error : funtion($xhr,textStatus,errorThrown){
        var string= $xhr.responseJSON;
        var json_object= JSON.parse(string);
        console.log("ERROR : ",  json_object.message);
    }

Thus will output "Error : failed" on console.

Upvotes: 4

hvgotcodes
hvgotcodes

Reputation: 120198

directly from the docs

The jQuery XMLHttpRequest (jqXHR) object returned by $.ajax() as of jQuery 1.5 is a superset of the browser's native XMLHttpRequest object. For example, it contains responseText and responseXML properties, as well as a getResponseHeader()

so use the jqXRH argument and get the responseText property off it.

In the link above, look for the section entitled

The jqXHR Object

Upvotes: 32

Related Questions