【问题标题】:JSON response from PHP script being enclosed in <head></head><body> ... <body>来自 PHP 脚本的 JSON 响应包含在 <head></head><body> ... <body> 中
【发布时间】:2010-09-11 10:00:18
【问题描述】:

我正在尝试调试一个简单的 PHP/JSON/jQuery 问题。

以下 PHP 脚本:

header('Content-type: text/javascript');
echo json_encode(array('type'=>'error','message'=>'arg')); 

正在被 jQuery 消费,但是当行:

var results = jQuery.parseJSON(responseText);

执行后,jQuery JSON 解析器给出以下信息:

uncaught exception: Invalid JSON: <head></head><body><pre>{"type":"error","message":"oops!"}</pre></body>

显然,head/body/pre 不应该被退回。

我在我的 PHP 代码中看不到任何隐藏字符或任何乱序。

有什么想法吗?

【问题讨论】:

  • 这是在使用 FireBug 时从服务器发送的确切响应吗?您托管此脚本的服务器能否附加这些 HTML 标记?
  • 你使用任何 PHP 框架吗?
  • Darin - 我得再检查一次 - 我会做一个小的 PHP 脚本,看看会发生什么。密切关注更新。 Felix - 不,我不是,主要是因为这个应用程序实际上是一个单页设置,可以为我和我的同事解决问题。我一直很顽皮,甚至不使用 OOP,因为它应该是一个简单的问题。
  • 好的 - 当我使用一个小的 PHP 脚本时:'success','message'=>'quicktest');回声 json_encode($output); ?> 结果是获取打开或保存“文件”的请求……嗯
  • 设置 Content-Type: text/plain;似乎稍微缓解了这个问题。

标签: php jquery json


【解决方案1】:

这两天让我难过。我正在使用 jQuery Form 插件的 ajaxSubmit 函数通过 AJAX 提交表单,而无需重新加载页面。在this question 向我展示了一个我之前没有注意到的参数后,我终于偶然发现了答案:dataType。

在幕后,一个 iframe 正在被创建,并且实际上正在向服务器进行回调。来自服务器的响应是从 iframe 中提取的,它带来了标签。

jQuery 表单插件通过允许您指定期望从服务器获得的响应类型来处理这种情况。如果我将“json”指定为响应类型,则会执行以下几行代码以从标签中获取 JSON:

// account for browsers injecting pre around json response
var pre = doc.getElementsByTagName('pre')[0];
if (pre) {
    xhr.responseText = pre.innerHTML;
}

(doc 是对 iframe 文档的引用,xhr 是最终从插件函数返回的 XmlHttpResponse 对象。)

我不确切知道您是如何进行 AJAX 调用的,但我猜想类似的构造(可能使用文档片段)将允许您从响应中提取必要的 JSON。

【讨论】:

    【解决方案2】:

    尽量不要发header('Content-type: text/javascript');

    【讨论】:

    • 感谢 Sanek,将仔细检查,可能需要稍微更改我的 apache MIME 设置
    • 好的,我试过了,但我得到的只是 Firefox 要求打开或保存 php 页面...
    【解决方案3】:

    json for php 查找“function send_as_json($obj)

    headers types

    【讨论】:

      【解决方案4】:

      将标头设置为 application/json。

      【讨论】:

      • 感谢 Paul,将仔细检查...可能需要稍微更改我的 apache MIME 设置
      猜你喜欢
      • 1970-01-01
      • 2019-11-25
      • 1970-01-01
      • 2012-05-26
      • 1970-01-01
      • 1970-01-01
      • 2016-05-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多