当HTTP响应有失败代码时,如何从JSON响应中读取属性?

时间:2014-12-03 17:26:46

标签: javascript jquery ajax json jqxhr

我有这段代码:

$.post(Routing.generate('parMarcaModelo'), {
    "marcaId": currBranch,
    "modeloId": currModel,
    "marcaNombre": currBranchName,
    "modeloNombre": currModelName
}, 'json').done(function (data, textStatus, jqXHR) {
    // do something here
}).fail(function (jqXHR, textStatus, errorThrown) {
    // Catch error from server and logs to console
    var err = eval("(" + jqXHR.responseText + ")");
    colose.log('Error', err.Message, 20000);

    return false;
});

服务器端返回类似这样的JSON:

{
   "success":false,
   "error":"El par Marca2-Modelo1 ya existe. Por favor escoja otra combinaci\u00f3n.",
}

但是也返回400代码,因此Ajax调用将通过.fail()的{​​{1}}回调。有了这些信息,我如何从.done()中的JSON中捕获error密钥以向用户显示?

我找到了这段代码:

.fail()

在SO上的this主题,但不知道是否正确,以及是否会影响我的代码。

任何帮助或建议?

1 个答案:

答案 0 :(得分:0)

您要将'json'作为成功回调函数发送给$.post()

这是正确的功能签名: jQuery.post( url [, data ] [, success ] [, dataType ] )


<强>澄清

此代码可以使用,因为它传入一个空函数来代替'success'。

$.post('rest.php', {data : 'data'}, function(){},'json').done(
function (data, textStatus, jqXHR) {
    // do something here
}).fail(function (jqXHR, textStatus, errorThrown) {
    // Catch error from server and logs to console
    console.log('Error', jqXHR.responseJSON, 20000);

    return false;
});

但是,此代码不会:

$.post('rest.php', {data : 'data'}, 'json').done(
function (data, textStatus, jqXHR) {
    // do something here
}).fail(function (jqXHR, textStatus, errorThrown) {
    // Catch error from server and logs to console
    console.log('Error', jqXHR.responseJSON, 20000);

    return false;
});

要获得证明,请查看jQuery source code中的第781-798行。如果data参数是函数,例如success回调,项目将被转移。但是,由于情况并非如此,因此每个参数都将按它们在函数中出现的位置输入。

在第二个版本中,Ajax.succees将设置为字符串'json'Ajax.dataType设置为undefined。该版本的jqXHR.responseJSON将返回undefined,因为它未被解析为JSON。

然而,第一个版本返回一个JSON对象。


此外,您在代码中写了colose.log而不是console.log。这可能就是无法获取数据的原因。