Не накладывает ли JSONP ограничение на размер ответа? - PullRequest
1 голос
/ 30 марта 2011

Я реализовал простой PHP-скрипт для обеспечения поддержки JSONP для набора JSON-файлов, которые я хочу получать с помощью междоменных запросов.

Вот оно:

<?php
$jsonFile = $_GET['resource'] . ".json";
$fh = fopen($jsonFile, 'r');
$jsonData = fread($fh, filesize($jsonFile));
fclose($fh);

$jsonData = trim($jsonData);
header("Content-type: application/json");  
echo $_GET['callback'] . '(' . $jsonData . ');'; 
?>

Это прекрасно работает, когда я набираю URL вручную. Если мой URL что-то вроде: http://mywebserverdotcom/jsonp/data.php?resource=jsondata&callback=processJsonData

вижу ответ в виде:

processJsonData([{"record_id":"317", ...}]);

и мои данные полны, и все выглядит хорошо.

Однако, когда я пытаюсь сделать это, используя следующий метод в моем HTML / JS:

1) Я добавил элемент внизу моего HTML-файла с URL-адресом выше

2) Реализован файл JS с функцией обратного вызова

Я получаю ошибку. Я использовал Web Inspector, чтобы увидеть ошибку, и она показывает ошибку в обратном вызове, и похоже, что обратный вызов обрезается примерно на 200 символов или около того (я не считал) символов в ответе, поэтому ответ теперь :

processJsonData([{"record_id":"317", ...

Данные обрезаются, поэтому формат JSON испорчен и закрытие отсутствует); в конце вызова функции, которая создает ошибку. Ошибка: переменная processJsonData не найдена.

Итак ... Либо я все делаю неправильно, либо есть ограничение по размеру в размере ответа, разрешенное с помощью обратного вызова JSONP через элемент script, или что-то еще, о чем я не думаю ....

Любая помощь высоко ценится!

Спасибо

Ответы [ 3 ]

2 голосов
/ 30 марта 2011

Нет, использование JSONP не должно ограничивать размер вашего ответа. Что касается транспортного уровня HTTP, вы просто отправляете некоторые текстовые данные с сервера на клиент; на самом деле все равно, что это за текстовые данные или как они структурированы внутри.

Возможно, проблема в коде на стороне сервера. Можете ли вы опубликовать используемый вами PHP?

1 голос
/ 30 марта 2011

Убедитесь, что ваш скрипт ответа JSONP включен после вашего скрипта, содержащего функцию обратного вызова.Похоже, что сообщение об ошибке указывает на то, что теги сценария вышли из строя.Ваши теги сценариев должны быть упорядочены следующим образом:

<script type="text/javascript" src="myscript.js" />
<script type="text/javascript" src="jsonprequest.php?callback=processJsonData&arg=1" />

JavaScript-код тега сценария не выполняется, пока не будут выполнены все предыдущие сценарии.Когда ваш скрипт запроса JSONP выполняется, он ожидает, что обработчик уже существует.Но если ваш сценарий, содержащий обработчик, не включен до окончания сценария JSONP, это слишком поздно.

0 голосов
/ 30 марта 2011

Вот выборка данных. Я оставил в обратном вызове на фронте. Это только часть данных, поэтому окончание]); не включены Это общедоступные данные. Я знаю, что это действительно JSON, потому что я использую точный тот же файл, используя Ajax вместо JSONP, чтобы загрузить его с моей локальной машины, и он работает нормально. Только при доступе через этот скрипт JSONP / PHP с удаленного сервера происходит сбой с ошибкой. Точное сообщение об ошибке:

ReferenceError: Can't find variable: callback

и местом ошибки является data.php: 1, который является моим удаленным PHP-скриптом.

callback([{"record_id":"317","artist":"Vern Luce","title":"Untitled","date":"1983","medium":"Painted steel","discipline":"sculpture","dimensions":"a: 93 \" x 40 \" x 64 \", b: 76.5 \" x 31 \" x 29 \", c: 48.5 \" x 85 \" x 20 \"","funding_source":"CETA","location":"MacLeay Park","street":"NW 29th Ave and Upshur St","city":"Portland","state":"OR","zipcode":"","lat":"45.535999799999999","lng":"-122.7110045","description":"Three geometric abstract steel sculptures are placed in a raised landscaped area in and located directly south of the Thurman Street Bridge.  In siting the work, the artist wanted the sculptures to respond both to the surrounding greenspace (thus, the bright red color) and to the broad horizontal expanse of the Thurman Street bridge (thus, the vertical nature of the sculptures).  At the time the pieces were installed, Vern Luce lived near Lower MacLeay Park and selected the site both for its visual beauty and its proximity to his home.\n\nProject History\nThe Comprehensive Education Training Act of the early 70's provided grants to a number of Portland artists that enabled them to create artwork.  As a result, over 500 works by 52 artists became part of the City of Portland's collection, providing a rich and diverse history of art in Portland.  Aside from Lower MacLeay Park, two other Portland parks feature permanent sculptures acquired through this program: a sculpture by Bruce West in Lair Hill Park and a piece by Jerry Allen in Peninsula Park.","image_url":"http:\/\/data.racc.org\/pa_inventory\/0240\/0240thumb.jpg","detail_url":"http:\/\/racc.org\/public-art\/search\/?recid=317.192","date_modified":"2010-07-19 00:00:00"},{"record_id":"359","artist":"Bruce West","title":"BW1","date":"1978","medium":"Cor-ten steel","discipline":"sculpture","dimensions":"6' x 30' x 20'","funding_source":"CETA 1976-77","location":"Lair Hill Park","street":"3000 SW Barbur Blvd","city":"Portland","state":"OR","zipcode":"97201","lat":"45.501570100000002","lng":"-122.68130650000001","description":"","image_url":"http:\/\/data.racc.org\/pa_inventory\/0098\/0098thumb.jpg","detail_url":"http:\/\/racc.org\/public-art\/search\/?recid=359.185","date_modified":"2010-12-29 00:00:00"},{"record_id":"362","artist":"Jerry  Allen","title":"Disc #4","date":"1979","medium":"Cast silicon bronze","discipline":"sculpture","dimensions":"diameter: 4 1\/2'","funding_source":"CETA 1977-78","location":"Peninsula Park","street":"6222 N. Albina  Avenue","city":"Portland","state":"OR","zipcode":"97217","lat":"45.568221899999998","lng":"-122.6748716","description":"","image_url":"http:\/\/data.racc.org\/pa_inventory\/0102\/0102thumb.jpg","detail_url":"http:\/\/racc.org\/public-art\/search\/?recid=360.55","date_modified":"2010-03-12 00:00:00"},
...