PHP JSON响应包含HTML头

PHP JSON响应包含HTML头,php,jquery,json,content-type,Php,Jquery,Json,Content Type,我遇到了一个奇怪的问题,我试图编写一个PHP页面,将一些JSON返回给jQueryAjax调用。问题在于,尽管将内容类型设置为application/json,但响应似乎总是包含HTML头 以下是PHP代码: // some code that generates an array header("Content-type: application/json"); echo json_encode($return); 然后在Javascript中: $.ajax({ url:

我遇到了一个奇怪的问题,我试图编写一个PHP页面,将一些JSON返回给jQueryAjax调用。问题在于,尽管将内容类型设置为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
每当我运行代码时,每次都会触发“错误!”警报,这是可以理解的。。。
有人知道为什么响应中会包含HTML吗?

你试过对整个“标题(…)”部分进行注释吗?没有它,它应该可以工作。AJAX调用获取PHP程序输出的所有内容,在本例中包括标头。

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

我建议您调试php代码流,以查看将这部分添加到html响应的位置

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

header()
用于设置HTTP头,而HTML代码(
)在HTTP响应的主体中发送

那么代码行呢

header("Content-type: application/json");
正确执行其工作,因为响应包含正确的内容类型:

Content-Type: application/json

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

在您这样做之前,可能会有一些内容发布标题。您能提供更多的php代码吗?请记住,php标记外的一个空格强制输出标题(默认情况下为http)。

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

ob_start("ob_tidyhandler"); 

在我的一个全球软件包中。评论说,这一切都很好。谢谢大家抽出时间

您如何检查响应?可能您的应用程序在其他地方也会这样做,并且由于您启用了输出缓冲,因此您没有收到“Header ready sent”错误。您使用的是框架还是独立的PHP文件?使用FireBug检查响应不使用任何PHP框架,使用我编写的几个类,但是他们除了调用几个SQL查询外,没有做任何令人兴奋的事情。唯一不同的是这个标题: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头的两个函数之一。您是否尝试过在服务器端使用静态模拟JSON文件?在哪里100%发送数据?好的,对于一个json.txt文件,只包含简单的json,它可以正常工作。这就是我在php文件中的错误。在返回json数据的初始php脚本之前,我有一个doctype标记。请确保将所有html标记放在php脚本下,这些脚本将决定您是发送数据还是输出下面的html。
ob_start("ob_tidyhandler");