【问题标题】:PHP JSON response contains HTML headersPHP JSON 响应包含 HTML 标头
【发布时间】:2011-06-15 03:20:24
【问题描述】:

我遇到了一个奇怪的问题,我正在尝试编写一个 PHP 页面,该页面将一些 JSON 返回到 Jquery AJAX 调用。问题是,尽管将内容类型设置为 application/json,但响应似乎总是包含 HTML 标头。

这是 PHP 代码:

// some code that generates an array
header("Content-type: application/json");
echo json_encode($return);

然后在Javascript中:

$.ajax({
        url: '/VAPHP/services/datatable.php',
        dataType: 'json',
        data:
            {
                type: 'invoices'
            },
        success: function(data)
        {
            // show a message saying it's been sent!
            alert('Success!');
        },
        error: function(XMLHttpRequest, textStatus, errorThrown) {
            alert('Error!');
        }


    });

响应似乎总是这样:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 3.2//EN">
<html>
<head>
<title></title>
</head>
<body>
{"aaData":[["2007-08-01","91109507","Invoice","10.000000","AUD"],["2007-08-02","91110103","Invoice","5.000000","AUD"],["2007-08-02","91110122","Invoice","305.000000","AUD"],["2007-08-02","91110129","Invoice","320.000000","AUD"],["2007-08-03","91111146","Credit
for Returns","10.000000","AUD"],["2007-08-06","91111895","Credit
for Returns","320.000000","AUD"],["2007-09-03","91128486","Credit
Memo","5.000000","AUD"],["2007-09-03","91128487","Credit
etc, etc

根据响应头,它肯定认为是 JSON:

HTTP/1.1 200 OK
Content-Type: application/json
Server: Microsoft-IIS/7.5
X-Powered-By: PHP/5.3.3

每当我运行代码时,它都会提示“错误!”每次都被解雇,这是可以理解的...... 有人知道为什么响应中包含 HTML 吗?

【问题讨论】:

  • 如何检查响应?
  • 您的应用程序可能会在其他地方执行此操作,并且由于您启用了输出缓冲,您不会收到“标头已发送”错误。
  • 您使用的是框架还是独立的 PHP 文件?
  • 用 Firebug 检查响应
  • 没有使用任何 PHp 框架,使用了我编写的一些类,但是除了调用几个 SQL 查询之外,它们没有做任何令人兴奋的事情。

标签: php jquery json content-type


【解决方案1】:

调用header() 实际上与响应中返回的 HTML 代码无关。

header() 用于设置 HTTP-headers,而 HTML-code (&lt;!DOCTYPE html PUBLIC "-//W3C//DTD HTML 3.2//EN"&gt;) 在 HTTP 响应的 body 中发送。

所以代码行

header("Content-type: application/json");

他的工作正确,因为响应包含正确的内容类型:

Content-Type: application/json

那怎么了?可能您的代码在处理 json 的代码之前执行。您应该在响应中只发送 json 编码的消息,不带任何 HTML 标记,并使用 exitdie 终止脚本。尝试找到发送 HTML 标记的代码并将您的代码放在 之前

【讨论】:

  • 这是我的 php 文件中的错误。在发送回 json 数据的初始 php 脚本之前,我有一个 doctype 标记。确保将所有 html 标签放在 php 脚本下,这将决定您是发送数据还是输出 html 波纹管。
【解决方案2】:

好的,我找到了自己的答案,看起来我在我的 PHP.ini 文件中打开了 tidyhtml,并且有一个

ob_start("ob_tidyhandler"); 

在我的一个全局包中。将其注释掉,一切正常。感谢大家的宝贵时间!

【讨论】:

    【解决方案3】:

    您是否尝试过评论整个“header(...)”部分?没有它它应该可以工作。 AJAX 调用获取 PHP 程序输出的所有内容,在本例中包括标题。

    【讨论】:

    • 唯一的区别是这个标头:HTTP/1.1 200 OK Content-Length: 3464 Content-Type: text/html Server: Microsoft-IIS/7.5 X-Powered-By: PHP/5.3。 3
    • 如果 firebug 显示来自服务器的数据具有 HTML 标头,并且这是您的整个 PHP 文件,它是生成 HTML 标头的 2 个函数之一。您是否尝试过在服务器端使用静态模拟 JSON 文件? 100% 的数据发送到哪里?
    • 好的,使用 json.txt 文件,只包含直接的 JSON,它可以正常工作
    【解决方案4】:

    我觉得您的代码的某些部分正在自动发出 HTML DTD 和头部部分,用于来自 php 代码库的所有响应。你在使用框架吗?如果有,是哪一个? json.txt 有效的事实表明 js、浏览器或介于两者之间的任何代理都没有问题。

    我建议你调试 php 代码流,看看这部分是从哪里添加到 html 响应中的。

    【讨论】:

      【解决方案5】:

      在您发布标题之前可能有一些东西。你能为此提供更多的 php 代码吗?请记住,php 标签之外的单个空格会强制输出标头(默认为 http)。

      【讨论】:

        猜你喜欢
        • 2023-03-16
        • 1970-01-01
        • 2013-10-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-08-01
        • 2011-09-05
        相关资源
        最近更新 更多