Ответ PHP JSON содержит заголовки HTML - PullRequest
6 голосов
/ 25 января 2011

У меня странная проблема, когда я пытаюсь написать страницу 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-код включается в ответ?

Ответы [ 5 ]

5 голосов
/ 25 января 2011

Вызов header() на самом деле не имеет ничего общего с HTML-кодом, возвращаемым в ответе.

header() используется для установки заголовков HTTP, а HTML-код (<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 3.2//EN">) отправляется в теле ответа HTTP.

Итак, строка кода

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

делает свою работу правильно, потому что ответ содержит правильный тип контента:

Content-Type: application/json

Так что не так? Возможно, у вас есть код, который выполняется до кода, который имеет дело с JSON. Вы должны отправлять в ответе только закодированное в json сообщение без каких-либо тегов HTML и завершать сценарий, используя exit или die. Попробуйте найти код, который отправляет теги HTML, и поместите код перед it.

2 голосов
/ 26 января 2011

Хорошо, я нашел свой собственный ответ, похоже, что я включил tidyhtml в своем файле PHP.ini, и в одном из моих глобальных пакетов был

ob_start("ob_tidyhandler"); 

.Прокомментировал это и все отлично работает.Всем спасибо за ваше время!

0 голосов
/ 25 января 2011

Вероятно, что-то публикует заголовки перед вами.Можете ли вы предоставить для этого больше кода php? Помните, что один пробел за пределами тегов php вызывает вывод заголовков (http по умолчанию).

0 голосов
/ 25 января 2011

Я чувствую, что какая-то часть вашего кода генерирует HTML DTD, а головная часть автоматически для всех ответов из кодовой базы php.Вы используете фреймворк?Если да, то какой?Тот факт, что json.txt работает, свидетельствует о том, что ничего не случилось с js, браузером или любыми прокси между ними.

Я предлагаю вам отладить поток кода php, чтобы увидеть, где эта часть добавляется в ответ html.

0 голосов
/ 25 января 2011

Вы пробовали комментировать весь заголовок (...) - часть? Это должно работать без него. AJAX-вызов получает все выходные данные PHP-программы, в данном случае включая заголовок.

...