2011-09-21 8 views
5

Sono totalmente perso con questo problema.La risposta JSON molto lunga si arresta e invia le intestazioni HTTP come testo quindi continua

Ho una query ajax che ottiene una risposta JSON. La query funziona bene nella maggior parte delle situazioni, tuttavia sembra inciampare quando la risposta JSON è molto grande.

Il problema è la risposta finisce nella forma:

...est":"test length"}]]} 
HTTP/1.1 200 OK 
Date: Wed, 21 Sep 2011 17:10:32 GMT 
Server: Apache/2.2.11 (Win32) mod_ssl/2.2.11 OpenSSL/0.9.8k PHP/5.3.0 
X-Powered-By: PHP/5.3.0 
Expires: Thu, 19 Nov 1981 08:52:00 GMT 
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0 
Pragma: no-cache 
Keep-Alive: timeout=5, max=90 
Connection: Keep-Alive 
Transfer-Encoding: chunked 
Content-Type: text/html 

5b03d 
{"ResultsInfo":{"RequestID":"131661886010","FeedCompletion":{"0":"100"}},"ResultsData":[[{"test":"test length"},{"test":"test length"}, 

...0 

Il ... rappresentare più della stessa "{" test ":" Lunghezza test "}," stringa

Così il reponse sembra essere in forma:

  • Ultima parte dei dati di intestazione di risposta
  • http stampati nel corpo
  • dei personaggi 5b03d '
  • prima parte dei dati
  • Il carattere '0'

non c'è una esatta lunghezza della risposta che questo avviene a tuttavia è bene a 360791 caratteri ma non a 372797 caratteri.

Sto usando il framework PHP Yii, ma ho cercato in lungo e in largo e non ho visto nulla nei forum.

Mi sembra che il server web stia separando la risposta in più parti o ritentando e ricominciando.

O forse c'è una dimensione massima del reso?

EDIT _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ ___

Ho provato l'applicazione/tipo di contenuto JSON come suggerito ma sta succedendo. Tes parte di testo dell'intestazione che viene restituito nel corpo è il seguente (quando si utilizza applciaiton/JSON codifica):

HTTP/1.1 200 OK 
Date: Thu, 22 Sep 2011 08:48:28 GMT 
Server: Apache/2.2.11 (Win32) mod_ssl/2.2.11 OpenSSL/0.9.8k PHP/5.3.0 
X-Powered-By: PHP/5.3.0 
Expires: Thu, 19 Nov 1981 08:52:00 GMT 
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0 
Pragma: no-cache 
Keep-Alive: timeout=5, max=89 
Connection: Keep-Alive 
Transfer-Encoding: chunked 
Content-Type: application/json 

Come faccio a disattivare la codifica Chunked per questo particolare script?

** EDIT 2_ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ _

ho aggiunto ora una lunghezza di contenuti ai miei intestazioni e l'intestazione della risposta che ottengo è ancora stampato nel corpo come:

HTTP/1.1 200 OK 
Date: Thu, 22 Sep 2011 11:55:39 GMT 
Server: Apache/2.2.11 (Win32) mod_ssl/2.2.11 OpenSSL/0.9.8k PHP/5.3.0 
X-Powered-By: PHP/5.3.0 
Expires: Thu, 19 Nov 1981 08:52:00 GMT 
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0 
Pragma: no-cache 
Content-Length: 372797 
Keep-Alive: timeout=5, max=90 
Connection: Keep-Alive 
Content-Type: application/json 

così sembra che non viene più inviato come chunked. Tuttavia, lo stesso problema esiste: la risposta ha un contenuto quindi l'intestazione viene stampata e quindi più contenuti.

** L'unica differenza ora è che non ha i caratteri '5b03d' o '0' nella risposta.

EDIT_3_ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ _

come richiesto ecco un riassunto del mio codice php

$dataArray = array(
    'ResultsData'=>array(
      array('test'=>'test length'), 
      array('test'=>'test length'), 
      array('test'=>'test length'), 
      ... 
)); 

$return = json_encode($dataArray); 

header('Content-Length: '.strlen($return)); 
header('Content-type: application/json'); 

echo $return; 
+0

Che aspetto ha il tuo codice PHP? Questo è molto insolito. –

risposta

2

ciò che state vedendo qui è codifica di trasferimento Chunked - http://en.wikipedia.org/wiki/Chunked_transfer_encoding

questo causa problemi in combinazione con il tipo di contenuto essere text/html. l'impostazione del tipo di contenuto su application/json dovrebbe risolvere il problema.

+0

Ciao, ho cambiato il mio tipo di contenuto in application/json come da mia modifica sopra e sta ancora accadendo (la codifica è ancora frammentata) –

1

Non ho trovato una risposta a questa domanda, ma ho isolato il problema.

In un file standard di PHP ho scritto questo codice:

<?php 

// Make a large array of strings 
for($i=0;$i<10000;$i++) 
{   
    $arr[] = "testing this string becuase it is must longer than all the rest to see if we can replicate the problem. testing this string becuase it is must longer than all the rest to see if we can replicate the problem. testing this string becuase it is must longer than all the rest to see if we can replicate the problem."; 
} 

// Create one large string from array 
$var = implode("-",$arr); 

// Set HTTP headers to ensure we are not 'chunking' response 
header('Content-Length: '.strlen($var)); 
header('Content-type: text/html'); 

// Print response 
echo $var; 

?> 

e andò ad esso in un browser e ha ottenuto lo stesso problema.

Qualcuno potrebbe provare questo per me? (Ho provato su due computer ora con lo stesso risultato)

2

Ho un server Java che risponde con codice JSON, dandomi la corruzione che sembri descrivere. Quando il json restituito diventa grande, il testo è corrotto. Browser diversi mostrano corruzioni diverse, ma lo stesso browser molto spesso corrompe nelle stesse posizioni.

In uno dei miei test ho inviato 9492 byte. I primi 1495 erano OK, mancavano i successivi 5204, sebbene le analisi di Wireshark mostrassero i byte nel flusso tcp. Poi i successivi 1495 byte arrivarono sani e salvi, mentre i successivi 1298 mancavano.

Questi numeri sono un esempio. Altri browser presenteranno diversi danni per lo stesso invio. Gli stessi browser possono ripetere quasi gli stessi numeri. Ad esempio, il primo danneggiamento è quasi sempre sullo stesso byte per Chrome.

Una quantità json limitata a dire 4000 byte sempre riuscita.

Non ho trovato un modo per fermare il chunkin impostando la lunghezza del contenuto in questo contesto. Solo per darti un'idea della credibilità dei codici: lo stesso Javaserver ha servito i browser con html per oltre 12 anni senza corruzione. Ma la risposta Json viene inviata dall'output senza che io imposti le intestazioni.

Penso che le intestazioni siano composte dal server Apache quando invio dal mio java-program.

0

Non ho mai avuto problemi nell'invio di Chunked Json. Ma ..

Il contenuto di destra sarà suddiviso in blocchi perché la lunghezza del contenuto non è chiara mentre PHP ripete questo e quello al client.

  1. ob_start() ... ob_end_flush() assicura che il contenuto sarà trasmette immediatamente e l'intestazione content-lenth viene impostata automaticamente.

  2. I dati compressi non verranno mai suddivisi in blocchi. Quindi: ob_start (ob_gzhandler) ... ob_end_flush() è efficace.

  3. Verifica il tuo json all'interno dello script del client.

  4. È inutile ripetere "test". C'è un limite per gli annidamenti.

dataArray = array ('ResultsData' => array (length0, length1, length2, ...));

echo json_encode ($ dataArray, JSON_NUMERIC_CHECK);

JSON_NUMERIC_CHECK strisce citazioni dai numeri.

  1. ? 5b03d? Cerchi di inviare stringhe binarie?

  2. Penso che una lunghezza del contenuto di 373kb sia lontana dall'overflow della memoria?

Problemi correlati