使$ .ajax将响应代码40x视为成功

时间:2016-01-15 13:09:23

标签: javascript jquery ajax

如果HTTP状态代码在200和299范围内或等于304,则jQuery执行“success”功能。 但是,例如,对于代码401,我需要jQuery认为Ajax调用是成功的,并且它将响应评估为JSON并执行函数“success”。

问题是这种行为在“完成”方法中是硬编码的:

// Determine if successful
isSuccess = status> = 200 && status <300 || === status 304;

我真的不知道该怎么做。

编辑:

这就是我现在所拥有的:

var options = {
    url: '',
    type: 'POST',
    data: {},
    success: function(response, status){},
    error: function(res, status, error){
        notify("Une erreur s'est produite !", "danger");
    },
    complete: function(res, status){}
};
$.extend(options, opts);
var dataString = '';
$.each(options.data, function(key, value){
    dataString += ((dataString.length > 0) ? '&' : '') + encodeURIComponent(key) + '=' + encodeURIComponent(value)
});
$.ajax({
    url: site_url + options.url,
    type: options.type,
    data: dataString,
    dataType: 'json',
    statusCode: {
        401: function() {
            setTimeout(function(){
                location.reload();
            }, 2000);
        }
    },
    success: function(response, status){
        if (response.response.result.status == 'ok'){
            options.success(response, status);
        } else {
            if ('message' in response.response.result){
                notify(response.response.result.message, "danger");
            } else if (response.response.errors.length > 0) {
                notify(response.response.errors[0], "danger");
            }

        }
    },
    error: options.error,
    complete: options.complete
});

我希望根据提供的dataType解析答案(仅用于“success”方法),并且在代码401的情况下,处理与包含正确JSON的其他响应的处理相同代码,除了进一步的指令。

我认为jQuery无法更改指示请求失败的代码是错误的。无论如何,响应的内容可能很重要,需要特殊处理。 对于完整的网页,浏览器仍会显示服务器在发生错误时返回的内容。

5 个答案:

答案 0 :(得分:3)

而不是试图超越&#34;成功&#34;回调为什么不只是在&#34;错误&#34;内部进行函数调用。在检查发生特定错误之前回调,当然。

error: function(a, b, c){
  if(a.status == 401){
    // Your custom function call / code.

  }
}

答案 1 :(得分:1)

您是否必须处理successerror区块中的状态代码? complete阻止怎么样?它遵循两种结果。

  

完整

     

类型:函数(jqXHR jqXHR,String textStatus)

     

请求完成时要调用的函数(执行成功和错误回调之后)。该函数传递两个参数:jqXHR(在jQuery 1.4.x,XMLHTTPRequest)对象和一个字符串,用于对请求的状态进行分类(“成功”,“未修改”,“nocontent”,“错误”,“超时”,“中止“,或”parsererror“)。从jQuery 1.5开始,完整的设置可以接受一系列函数。每个函数将依次调用。这是一个Ajax事件。

来源:http://api.jquery.com/jquery.ajax/

示例:

$.ajax({
    url: "http://www.google.com"
}).success(function(){  //--> use .done() instead
    //things to do on success

}).error(function(){ //--> use .fail() instead
    //things to do on error

}).complete(function( data ) { //--> use .always() instead
    switch(data.status){
        //your logic here
    }
});

答案 2 :(得分:0)

而不是成功使用complete函数并检查xhr.statusText

$.ajax('url.json', {
  complete:function(result) {
    if(/^(2\d\d|304|401)$/.test(result.statusText)) {
      success();
    } else {
      error();
    }
  }
});

答案 3 :(得分:0)

最后,鉴于需要通过“完整”方法,有必要重新编写jQuery的整个自动化。 所以在这种情况下使用$ .ajax没兴趣。

这就是我必须编写使用jQuery语法的替换函数的原因:

var altAjax = function(opts){
    var options = {
        url: '',
        type: 'GET',
        data: {},
        dataType: 'text',
        successCodes: [304, 401, 403, 404, 500],
        statusCode: {},
        success: [],
        error: [],
        complete: []
    };
    $.extend(options, opts);

    var success = function(data, textStatus, xhr){
        if ($.isArray(options.success)){
            $.each(options.success, function(index, callback){
                callback(data, textStatus, xhr);
            });
        } else if ($.isFunction(options.success)){
            options.success(data, textStatus, xhr);
        }
        if ($.isFunction(options.statusCode[xhr.status])){
            options.statusCode[xhr.status](data, textStatus, xhr);
        }
    }

    var error = function(xhr, textStatus, errorThrown){
        if ($.isArray(options.error)){
            $.each(options.error, function(index, callback){
                callback(xhr, textStatus, errorThrown);
            });
        } else if ($.isFunction(options.error)){
            options.error(xhr, textStatus, errorThrown);
        }
        if ($.isFunction(options.statusCode[xhr.status])){
            options.statusCode[xhr.status](xhr, textStatus, errorThrown);
        }
    }

    var complete = function(xhr, textStatus){
        if ($.isArray(options.complete)){
            $.each(options.complete, function(index, callback){
                callback(xhr, textStatus);
            });
        } else if ($.isFunction(options.complete)){
            options.complete(xhr, textStatus);
        }
    }

    var dataString = '';
    $.each(options.data, function(key, value){
        dataString += ((dataString.length > 0) ? '&' : '') + encodeURIComponent(key) + '=' + encodeURIComponent(($.isArray(value) || $.isPlainObject(value)) ? JSON.stringify(value) : value);
    });

    var req = new XMLHttpRequest();
    var url = options.url;
    if (options.type.toUpperCase() != 'POST'){
        url += ((url.indexOf('?') > -1) ? '&' : '?') + dataString;
    }
    req.onload = function(){
        var textStatus = 'error';
        if ((this.status >= 200 && this.status <= 299) || $.inArray(this.status, options.successCodes) > -1) {
            var data;
            switch (options.dataType.toLowerCase()) {
                case 'json':
                    try {
                        data = JSON.parse(this.responseText);
                    } catch (ex){
                        error(this, textStatus, ex.name + ': ' + ex.message);
                        break;
                    }
                    textStatus = 'success';
                    success(data, textStatus, this);
                    break;
                case 'xml':
                    try {
                        data = $.parseXML(this.responseText);
                    } catch (ex){
                        error(this, textStatus, ex.name + ': ' + ex.message);
                        break;
                    }
                    textStatus = 'success';
                    success(data, textStatus);
                    break;
                default:
                    textStatus = 'success';
                    success(this.responseText, textStatus);
            }
        } else {
            error(this, textStatus, null);
        }
        complete(this, textStatus);
    };
    req.open(options.type, url, true);
    if (options.type.toUpperCase() == 'POST'){
        req.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
        req.send(dataString);
    } else {
        req.send();
    }
    req = null;
};

答案 4 :(得分:-2)

您需要在客户端处理条件以检查状态代码。您可以按如下方式获取状态:

success: function(data, textStatus, xhr) {
  console.log(xhr.status);
},