Используя jquery, я могу отправлять объекты json с клиента на сервер с помощью ajax следующим образом:
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 });
Это работает хорошо. Но если строка JSON становится намного больше (не уверен в точном размере, но где-то примерно в 5 раз больше), данные $ _POST, полученные сервером, пустые. Кто-нибудь знает, почему?
Я использую Apache / PHP / jquery. Это происходит как из IE, так и из Firefox. Есть ли настройка конфигурации где-то мне нужно настроить?
Ниже приведен пример строки, которая не позволяет выполнить ее:
{"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":""}],}]}]}
Он создается с помощью jinn.org «stringify»:
var strJSON = JSON.stringify(oEvent);
EDIT: исследуя далее, я изменил dataType на «текст» и попытался отправить длинную строку чисел. Он работает до ~ 3500 символов, затем задыхается (и когда я говорю «дроссель», я имею в виду, что запрос поступает на сервер с нулевым $ _POST.)
Мой PHP post_max_size – 64M, так что это не так. Кто-то предложил использовать «LimitRequestBody» Apache, которого не было в httpd.conf, поэтому я добавил ему «LimitRequestBody 0» и перезагрузил Apache. Это тоже не помогло.
Любые другие предложения ???
Вероятно, это связано с конфигурацией вашего сервера. Проверьте php.ini для параметра max_post_size
и убедитесь, что он достаточно велик для публикации ваших данных. Также проверьте настройки своего веб-сервера – у Apache есть директива LimitRequestBody
которая может вызвать проблемы. Наконец, проверьте журналы веб-сервера и PHP, чтобы узнать, вызывает ли большая почта какие-либо ошибки.
Всего несколько указателей на всех, кто находит эту страницу – я столкнулся с аналогичной проблемой, когда строка JSON не была проанализирована с помощью jQuery.parseJSON()
.
Я смущен, чтобы сказать, что моя проблема (вероятно, не связанная с проблемой OP) была фактически вызвана бродячей одиночной цитатой. Сбежав, он решил проблему. Я предполагал, что это связано с длиной строки, так как это, казалось, происходило только с длиной JSON длиной 8000 символов, но это была бродячая цитата, которая прерывала строку в неправильном месте.
Тим, я не знаю, если вы когда-нибудь дошли до сути своей исходной проблемы, но вставляете строку, которую вы поставили:
{"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":""}],}]}]}
в http://json.parser.online.fr/ дает следующую ошибку, если это может помочь кому-либо еще:
SyntaxError: JSON.parse: expected double-quoted property name
Кажется, что есть проблема с размером, при тестировании моей строки Json все работает, когда строка мала, когда я увеличиваю строку (php-массив, который нужно закодировать), вывод строки Json прерывается.
при выполнении строковой длины в неудавшейся строке я получаю (7796). Поэтому я изменил параметр max post в файле ini как для cli, так и apache до 64M вместо 8M, и я все еще получаю ту же проблему. Я не думаю, что эта проблема ограничена apache LimitRequestBody, поскольку php дает тот же результат в CLI.
Еще одна вещь, когда вы делаете var_dump в закодированной строке json, я могу видеть, когда она нарезается, и json-теги не закрываются, поэтому почему-то декодер Json возвращает нуль.
например
$strJson = file_get_contents('http://mydomain/page'); var_dump($strJson);
Вы увидите, где строка прерывается, а нуль объединяется до конца вывода.
Тип данных «jsonp» не использует метод POST и не может его использовать. Вместо этого все данные передаются в строке запроса. Таким образом, если превышена максимальная длина строки запроса сервера, данные не будут переданы. Причиной этого является то, что jQuery загружает json-данные в виде узла в ваш html-документ, и это можно сделать только как GET. Если вам нужно больше данных, вам придется использовать XML или другое.