【问题标题】:jQuery ajax json -- viewing incorrect data returnedjQuery ajax json -- 查看返回的错误数据
【发布时间】:2014-08-21 15:30:05
【问题描述】:

我在客户端/服务器环境中广泛使用 jQuery $.ajax({dataType: 'json'}),它运行良好......当它运行良好时。问题是,当服务器出现故障时,它不会以 json 格式返回错误消息(我正在使用带有 cgitb 的 python)。我想做的是为success:函数保留dataType: 'json',但为error:函数获取原始文本或html——有没有办法在数据或errorThown中从jQuery获取未解析的服务器响应部分?

【问题讨论】:

  • 一种解决方案是简单地删除 dataType: 'json' 并设置正确的内容类型响应标头。设置正确的标头后,jQuery 仍会自动解析 JSON。
  • 您也可以使用complete 处理程序而不是success。 Complete 收到 ( jqXHR jqXHR, String textStatus ),其中 jqHXR.responseText 应该会给你原始响应。
  • 是否有可能将查询错误地识别为success:,即使它返回为非JSON?我不想在每个 success: function() 处理程序中编写检查器来检查数据是否以 JSON 格式返回。但是这个,或者 Nikhil 的建议可能是要走的路。
  • 您还应该考虑配置您的服务器以在出现错误时发回非 200 响应代码。
  • Mike -- 在生产环境中,肯定的;在测试环境中,我只是使用 Python 的 CGIHTTPServer,不幸的是,它在加载脚本后立即返回 200 OK。

标签: javascript jquery python ajax json


【解决方案1】:

问题最终是 cgitb 的 reset() 函数,旨在“摆脱”糟糕的 HTML 情况,搞砸了 jQuery 解析,因此当 jqXHR 被传递给 error 时,responseText标签为空。该错误在 Safari 和 Chrome 上显示良好,但实际上是格式非常糟糕的 HTML。我最终替换了 cgitb 中的一些函数并使用 cgitb.handle() 函数而不是调用 cgitb.enable。以下是部分代码:

import sys
import cgitb

def noRest():
    return "Content-Type: text/html\n\n<html>\n"
cgitb.reset = noRest
oldhtml = cgitb.html
def newHTML((etype, evalue, etb), context=5):
    x = oldhtml((etype, evalue, etb), context)
    return x + "\n</body></html>\n"
cgitb.html = newHTML

try:
     [ main script here ]
except Exception as e:
     cgitb.handler(sys.exc_info())

然后$.ajax({ }) 例程可以不理会,error: function(xhr) { } 处理xhr.responseText

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-04
    • 2012-05-14
    • 2017-08-02
    相关资源
    最近更新 更多