Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

PHP JSON response contains HTML headers

I've got a strange problem where I'm trying to write a PHP page that returns some JSON to a Jquery AJAX call. Problems is that despite setting the content type to application/json, the response always seems to include the HTML header.

Here's the PHP code:

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

Then in 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!');
        }


    });

The response always seems to be something like this:

<!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

And according to the response header it certainly thinks it's JSON:

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

Whenever I run the code and it alert "Error!" gets fired every time, which is understandable... Anyone got any ideas why the HTML is being included in the response?

like image 254
hellboy1975 Avatar asked Jan 25 '11 11:01

hellboy1975


2 Answers

Calling header() actually has nothing to do with HTML-code being returned in the response.

header() is used to set HTTP-headers, while HTML-code (<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 3.2//EN">) is sent in the body of HTTP response.

So the line of code

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

does his job correctly because response contains correct content type:

Content-Type: application/json

So what's wrong? Probably you have code that is executed before the code that deals with json. You should send only json encoded message in your response without any HTML tags and terminate the script using exit or die. Try to locate the code that sends HTML tags and put your code before it.

like image 103
galymzhan Avatar answered Nov 15 '22 17:11

galymzhan


Ok, I found my own answer, looks like I had tidyhtml turned on inside my PHP.ini file, and had a

ob_start("ob_tidyhandler"); 

inside one of my global packages. Commented that out and it all works fine. Thanks for your time everyone!

like image 24
hellboy1975 Avatar answered Nov 15 '22 16:11

hellboy1975