【问题标题】:Can I evaluate the response type of an $.ajax() call in success callback?我可以在成功回调中评估 $.ajax() 调用的响应类型吗?
【发布时间】:2008-11-14 21:16:00
【问题描述】:

我正在使用 jQuery 向远程端点发出 AJAX 请求。如果发生故障,该端点将返回一个 JSON 对象,并且该对象将描述故障。如果请求成功,它将返回 HTML 或 XML。

我了解了如何在 jQuery 中将预期的请求类型定义为 $.ajax() 调用的一部分。有没有办法在success处理程序中检测请求类型?

$.ajax(
    {
        type: "DELETE",
        url: "/SomeEndpoint",
        //dataType: "html",
        data:
            {
                "Param2": param0val,
                "Param1": param1val
            },
        success: function(data) {
                //data could be JSON or XML/HTML
            },
        error: function(res, textStatus, errorThrown) {
                alert('failed... :(');
            }
    }
);

【问题讨论】:

    标签: javascript jquery ajax


    【解决方案1】:

    您的应用程序是否生成正确的 Content-Type 标头(application/json、text/xml 等)并在您的成功回调中处理这些标头。也许这样的事情会起作用?

    xhr = $.ajax(
        {
            //SNIP
            success: function(data) {
                    var ct = xhr.getResponseHeader('Content-Type');
                    if (ct == 'application/json') {
                        //deserialize as JSON and continue
                    } else if (ct == 'text/xml') {
                        //deserialize as XML and continue
                    }
                },
             //SNIP
    );
    

    未经测试,但值得一试。

    【讨论】:

    • 虽然 Owen 的响应是适当的,但完整的回调没有获取数据,因此您必须使用类似的模式(将数据存储在方法范围之外......过程完成)。我采用这种方法是因为我认为它更干净。
    【解决方案2】:

    使用complete 选项怎么样?

    $.ajax({
       ...
    
       complete : function(xhr, status) {
       // status is either "success" or "error"
       // complete is fired after success or error functions
       // xhr is the xhr object itself
    
           var header = xhr.getResponseHeader('Content-Type');
       },
    
       ...
    });
    

    【讨论】:

    • 是的,这比我建议的还要好。
    【解决方案3】:

    当它调用你的成功处理程序时,数据已经为你反序列化了。对于任何成功的结果,您需要始终返回相同的数据类型。如果确实存在错误,您可能应该抛出一个异常并让它由错误回调处理。这样应该可以解析出产生的错误,打包给你的回调,也就是会检测响应没有200 OK状态,解析结果得到错误信息。

    【讨论】:

    • 我有一个方法在某些情况下返回 JSON,在其他情况下返回 HTML。它返回错误的 JSON 描述的原因是因为它是一个描述所有服务器端数据验证错误的对象。这似乎是使用合适的模式。不同意?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-08
    • 2022-10-09
    • 2015-11-12
    • 2015-05-07
    • 1970-01-01
    相关资源
    最近更新 更多