2011-01-25 27 views
6

Tengo un problema extraño cuando intento escribir una página PHP que devuelve algo de JSON a una llamada Jquery AJAX. Los problemas son que a pesar de establecer el tipo de contenido en application/json, la respuesta siempre parece incluir el encabezado HTML.Respuesta PHP JSON contiene encabezados HTML

Aquí está el código PHP:

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

Luego, en 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!'); 
     } 


    }); 

La respuesta siempre parece ser algo como esto:

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

Y de acuerdo a la cabecera de respuesta Ciertamente cree que es JSON:

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

Cada vez que ejecuto el código y alerta "¡Error!" se dispara cada vez, lo que es comprensible ... ¿Alguien tiene alguna idea de por qué el HTML se está incluyendo en la respuesta?

+2

¿Cómo se inspecciona la respuesta? –

+4

Probablemente su aplicación lo haga en cualquier otro lugar, y como tiene habilitado el almacenamiento en búfer de salida, no obtiene el error de "encabezados ya enviados". – Mchl

+1

¿Está utilizando un marco o es un archivo PHP independiente? –

Respuesta

2

Ok, encontré mi propia respuesta, parece que tuve tidyhtml activado dentro de mi PHP.archivo ini, y tenía un

ob_start("ob_tidyhandler"); 

dentro de uno de mis paquetes globales. Lo comenté y todo funciona bien. Gracias por su tiempo a todos!

0

¿Ha intentado comentar todo el "encabezado (...)" - parte? Debería funcionar sin eso. La llamada AJAX obtiene todo lo que produce el programa PHP, en este caso incluyendo el encabezado.

+0

La única diferencia que hace es este encabezado: HTTP/1.1 200 OK Content-Length: 3464 Content-Type: text/html Servidor: Microsoft-IIS/7.5 X-Powered-By: PHP/5.3.3 – hellboy1975

+0

Si Firebug muestra que los datos vienen desde el servidor tiene el encabezado HTML, y ese es tu archivo PHP completo, es una de las 2 funciones que producen el encabezado HTML. ¿Has probado con un archivo simulado JSON en el lado del servidor? ¿Dónde estás el 100% de los datos que se envían? – Marcus

+0

Sin tener en cuenta que - ¡No debería codificar tarde en la noche! – hellboy1975

0

Siento que una parte de su código emite el HTML DTD y la parte principal automáticamente para todas las respuestas de la base de código php. ¿Estás usando un marco? Si es así, Cuál ? El hecho de que json.txt funcione es indicativo de que nada está mal con js, navegador o cualquier proxy entre ellos.

Sugiero que depure el flujo de código php para ver dónde esta parte se está agregando a la respuesta html.

5

Llamar a header() en realidad no tiene nada que ver con el código HTML que se devuelve en la respuesta.

header() se utiliza para ajustar HTTP-cabeceras, mientras que de código HTML (<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 3.2//EN">) se envía en el cuerpo de la respuesta HTTP.

Así que la línea de código

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

hace su trabajo correctamente porque contiene la respuesta correcta tipo de contenido:

Content-Type: application/json 

Entonces, ¿qué pasa? Probablemente tiene código que se ejecuta antes de el código que trata con json. Debe enviar solo el mensaje codificado json en su respuesta sin etiquetas HTML y finalizar el script usando exit o die. Intente localizar el código que envía etiquetas HTML y ponga su código antes de.

+0

¿Cómo se escribe en el código del archivo php? – Gank

+0

ESTO es lo que tenía mal en mi archivo php. Tenía una etiqueta doctype antes del script php inicial que envía datos json de regreso. Asegúrese de poner todas las etiquetas html bajo las secuencias de comandos php que determinarán si va a enviar datos o emitir el html abajo. – OzzyTheGiant

0

Probablemente hay algo publicando encabezados antes de hacerlo. ¿Puede proporcionar más del código php para esto? Recuerde que un solo espacio en blanco fuera de las etiquetas php obliga a la salida de los encabezados (http por defecto).

Cuestiones relacionadas