2009-10-09 34 views
14

usando jQuery, soy capaz de enviar objetos JSON del cliente al servidor usando AJAX como esta:Tamaño máximo del objeto JSON?

var strJSON = '{"event":[{ 
    "dates":[ 
     "2009-10-14","2009-10-15"], 
    "teams":[ 
     {"id":"0","country":"USA","state":"CA","name":"California Polytechnic State University","subteam":""}, 
     {"id":"1","country":"USA","state":"CA","name":"California State University, Bakersfield","subteam":""}, 
     {"id":"2","country":"USA","state":"CA","name":"California State University, Fresno","subteam":""}, 
     {"id":"3","country":"USA","state":"CA","name":"California State University, Fullerton","subteam":""}] 
}]}'; 

$.ajax({ 
    url: '../ajax/save_event', 
    type: 'POST', 
    data: { data : strJSON }, 
    dataType: 'json', 
    timeout: 8000, 
    cache: false 
}); 

funciona bien. Pero si la cadena JSON es mucho más grande (no estoy seguro del tamaño exacto, pero alrededor de 5 veces más grande), los datos $ _POST recibidos por el servidor están vacíos. ¿Alguien sabe por qué?

Estoy usando Apache/PHP/jquery. Sucede desde IE y Firefox. ¿Hay algún ajuste de configuración en algún lugar que deba ajustar?

He aquí un ejemplo de una cadena que no puede hacerlo a través de:

{"events":[{"dates":["2009-10-10","2009-10-11","2009-10-12"],"divisions":[{"level":"Collegiate","name":"Varsity","subdivision":"Division I","rounds":[],"teams":[{"id":"0","country":"USA","state":"CA","name":"California Polytechnic State University","subteam":""},{"id":"1","country":"USA","state":"CA","name":"California State University, Bakersfield","subteam":""},{"id":"2","country":"USA","state":"CA","name":"California State University, Fresno","subteam":""},{"id":"3","country":"USA","state":"CA","name":"California State University, Fullerton","subteam":""},{"id":"4","country":"USA","state":"CA","name":"Stanford University","subteam":""},{"id":"5","country":"USA","state":"CA","name":"University of California, Davis","subteam":""},{"id":"6","country":"USA","state":"CA","name":"San Francisco State University","subteam":""},{"id":"7","country":"USA","state":"CA","name":"Lassen Community College","subteam":""},{"id":"8","country":"USA","state":"CA","name":"Menlo College","subteam":""},{"id":"9","country":"USA","state":"CA","name":"Fresno Pacific University","subteam":""},{"id":"10","country":"USA","state":"CA","name":"Bakersfield","subteam":""},{"id":"11","country":"USA","state":"CA","name":"Buchanan","subteam":""},{"id":"12","country":"USA","state":"CA","name":"Campolindo-Moraga","subteam":""},{"id":"13","country":"USA","state":"CA","name":"Fremont-Sunnyvale","subteam":""},{"id":"14","country":"USA","state":"CA","name":"Ponderosa-Shingle Springs","subteam":""},{"id":"15","country":"USA","state":"CA","name":"West Covina","subteam":""},{"id":"16","country":"USA","state":"CA","name":"Gilroy","subteam":""},{"id":"17","country":"USA","state":"CA","name":"San José State University","subteam":""},{"id":"18","country":"USA","state":"CA","name":"University of California, Los Angeles","subteam":""},{"id":"19","country":"USA","state":"CA","name":"Sierra College","subteam":""},{"id":"20","country":"USA","state":"CA","name":"Selma","subteam":""},{"id":"21","country":"USA","state":"CA","name":"Liberty","subteam":""}],}]}]} 

es creado usando json.org de "stringify":

var strJSON = JSON.stringify(oEvent); 

EDIT: Al investigar más, me cambió el tipo de datos a "texto" y trató de enviar una larga cadena de números. Funciona hasta ~ 3500 caracteres y luego se estrangula (y cuando digo "estrangular" me refiero a que la solicitud llega al servidor con un nulo $ _POST.)

Mi PHP post_max_size es 64M, eso no es todo. Alguien sugirió usar "LimitRequestBody" de Apache, que no estaba en httpd.conf, así que agregué "LimitRequestBody 0" y reinicié Apache. Eso tampoco ayudó.

¿Alguna otra sugerencia?

+1

¿Puedes probar y no tener una cuerda para comenzar? Como en, solo tiene un objeto JavaScript que pasa al parámetro 'data' de la llamada' ajax'. Mira qué pasa. – rfunduk

+2

Por favor, publique un ejemplo de falla de JSON. 5 veces más grande que lo que has publicado no es tan grande. Puede ser un problema de escape o problema de estructura en la cadena JSON. – Asaph

+0

Muy bien, acabo de agregar un ejemplo anterior. Se crea con stringify(). –

Respuesta

6

Esto probablemente se deba a la configuración de su servidor. Compruebe php.ini para la configuración max_post_size y asegúrese de que sea lo suficientemente grande como para publicar sus datos. También verifique la configuración de su servidor web: Apache tiene una directiva LimitRequestBody que podría estar causando su problema. Finalmente, verifique su servidor web y los registros de errores de PHP para ver si la publicación grande está desencadenando algún error.

+0

Pensé eso también, pero esto es lo que dice: post_max_size = 64M Eso es 64 megabytes, ¿correcto? –

+0

También consulte httpd.conf para 'LimitRequestBody' – pix0r

+0

(y sí, 64M == 64 megabytes). – pix0r

2

Parece que hay un problema de tamaño, cuando pruebo la cadena Json todo funciona cuando la cadena es pequeña, cuando incremente la cadena (matriz php a codificar) la salida de la cadena Json se corta.

al hacer una longitud de cadena en la cadena fallida, obtengo (7796). Así que cambié la opción de publicación máxima en el archivo ini tanto para cli como apache a 64M en lugar de 8M y sigo teniendo el mismo problema. No creo que este problema esté restringido a apache LimitRequestBody ya que php da el mismo resultado en CLI.

Una cosa más, al hacer un var_dump en la cadena json codificada, puedo ver cuándo se corta y las etiquetas json no se cierran, de ahí por qué el decodificador Json devuelve un nulo.

por ejemplo

$strJson = file_get_contents('http://mydomain/page'); 
var_dump($strJson); 

Va a ver donde la cadena se cortó y se concatena un cero al final de la salida.

+1

Ronald, ¿alguna vez pudo encontrar una solución a esto? Me enfrento al mismo problema, aunque mi cadena se interrumpe en 3127 caracteres – solefald

+1

¡Hola! También estoy interesado. ¿Has resuelto esto? – Industrial

3

Solo un par de consejos para cualquier persona que encuentre esta página: me encontré con un problema similar con una cadena JSON que no se puede analizar utilizando jQuery.parseJSON().

Me avergüenza decir que mi problema (probablemente sin relación con el problema de OP) fue causado por una cita suelta. Escapar resolvió el problema.Originalmente pensé que estaba relacionado con la longitud de la cadena, ya que solo parecía estar sucediendo con una cadena JSON de 8,000 caracteres de longitud, pero era la cita suelta que terminaba la cadena en el lugar equivocado.

Tim, no sé si alguna vez llegamos a la parte inferior de su emisión original, pero pegando la cadena que ha proporcionado:

{"events":[{"dates":["2009-10-10","2009-10-11","2009-10-12"],"divisions":[{"level":"Collegiate","name":"Varsity","subdivision":"Division I","rounds":[],"teams":[{"id":"0","country":"USA","state":"CA","name":"California Polytechnic State University","subteam":""},{"id":"1","country":"USA","state":"CA","name":"California State University, Bakersfield","subteam":""},{"id":"2","country":"USA","state":"CA","name":"California State University, Fresno","subteam":""},{"id":"3","country":"USA","state":"CA","name":"California State University, Fullerton","subteam":""},{"id":"4","country":"USA","state":"CA","name":"Stanford University","subteam":""},{"id":"5","country":"USA","state":"CA","name":"University of California, Davis","subteam":""},{"id":"6","country":"USA","state":"CA","name":"San Francisco State University","subteam":""},{"id":"7","country":"USA","state":"CA","name":"Lassen Community College","subteam":""},{"id":"8","country":"USA","state":"CA","name":"Menlo College","subteam":""},{"id":"9","country":"USA","state":"CA","name":"Fresno Pacific University","subteam":""},{"id":"10","country":"USA","state":"CA","name":"Bakersfield","subteam":""},{"id":"11","country":"USA","state":"CA","name":"Buchanan","subteam":""},{"id":"12","country":"USA","state":"CA","name":"Campolindo-Moraga","subteam":""},{"id":"13","country":"USA","state":"CA","name":"Fremont-Sunnyvale","subteam":""},{"id":"14","country":"USA","state":"CA","name":"Ponderosa-Shingle Springs","subteam":""},{"id":"15","country":"USA","state":"CA","name":"West Covina","subteam":""},{"id":"16","country":"USA","state":"CA","name":"Gilroy","subteam":""},{"id":"17","country":"USA","state":"CA","name":"San José State University","subteam":""},{"id":"18","country":"USA","state":"CA","name":"University of California, Los Angeles","subteam":""},{"id":"19","country":"USA","state":"CA","name":"Sierra College","subteam":""},{"id":"20","country":"USA","state":"CA","name":"Selma","subteam":""},{"id":"21","country":"USA","state":"CA","name":"Liberty","subteam":""}],}]}]} 

en http://json.parser.online.fr/ da el siguiente error, si se trata de alguna ayuda a cualquier otra persona:

SyntaxError: JSON.parse: expected double-quoted property name

+0

[Un usuario anónimo comenta] (http://stackoverflow.com/suggested-edits/219484): Hay una coma al final de la matriz que probablemente cause este error: '..." Liberty "," subteam ":" "}],}]}]}' Este es JSON incorrecto. Algunos navegadores pueden recuperarse ignorando las comillas finales, pero algunos no pueden analizarlo. – Rup

1

'jsonp' tipo de datos no puede y no utilizar el método POST. En su lugar, todos los datos se pasan en una cadena de consulta. Por lo tanto, si se excede la longitud máxima de cadena de consulta del servidor, no se pasarán los datos. La razón de esto es que jQuery carga los datos json como un nodo en su documento html, y esto solo se puede hacer como un GET. Si necesita más datos, deberá usar XML u otro.

+0

Debería haber especificado (pensé que lo hice): La solicitud json se envía al agregar un nodo

Cuestiones relacionadas