PHP JSON响应包含HTML标头

hel*_*975 7 php jquery json content-type

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

这是PHP代码:

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

然后在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!');
        }


    });
Run Code Online (Sandbox Code Playgroud)

响应似乎总是这样:

<!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
Run Code Online (Sandbox Code Playgroud)

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

HTTP/1.1 200 OK
Content-Type: application/json
Server: Microsoft-IIS/7.5
X-Powered-By: PHP/5.3.3
Run Code Online (Sandbox Code Playgroud)

每当我运行代码时它会提示"错误!" 每次都被解雇,这是可以理解的......任何人都有任何想法为什么HTML被包含在响应中?

gal*_*han 5

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

header()用于设置HTTP标头,而HTML-code(<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 3.2//EN">)则在HTTP响应中发送.

所以代码行

header("Content-type: application/json");
Run Code Online (Sandbox Code Playgroud)

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

Content-Type: application/json
Run Code Online (Sandbox Code Playgroud)

那有什么不对?可能你有代码处理json的代码之前执行.您应该在响应中仅发送json编码的消息而不使用任何HTML标记,并使用exit或终止脚本die.尝试找到发送HTML标记的代码并将代码放在其前面.


hel*_*975 2

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

ob_start("ob_tidyhandler"); 
Run Code Online (Sandbox Code Playgroud)

在我的一个全局包中。评论出来,一切正常。感谢大家抽出时间!