PHP JSON 响应包含 HTML 标头

Posted

技术标签:

【中文标题】PHP JSON 响应包含 HTML 标头【英文标题】:PHP JSON response contains HTML headers 【发布时间】: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 查询之外,它们没有做任何令人兴奋的事情。 【参考方案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)。

【讨论】:

以上是关于PHP JSON 响应包含 HTML 标头的主要内容,如果未能解决你的问题,请参考以下文章

CORS 尝试,php 未修改响应标头

Laravel 强制 json 响应 api

PHP/Curl:在下载正文之前检查响应标头

将 REST 服务的 CSRF 令牌作为 Http 响应标头包含在内是不是安全?

在 Angular 8 的 http 响应中看不到任何响应标头

在“呈现为 JSON”之后添加自定义标头以响应