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 (<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 3.2//EN">
) 在 HTTP 响应的 body 中发送。
所以代码行
header("Content-type: application/json");
他的工作正确,因为响应包含正确的内容类型:
Content-Type: application/json
那怎么了?可能您的代码在处理 json 的代码之前执行。您应该在响应中只发送 json 编码的消息,不带任何 HTML 标记,并使用 exit
或 die
终止脚本。尝试找到发送 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 标头的主要内容,如果未能解决你的问题,请参考以下文章
将 REST 服务的 CSRF 令牌作为 Http 响应标头包含在内是不是安全?