3 вопроса о формате JSON-P - PullRequest
2 голосов
/ 18 апреля 2010

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

Итак, пользователь stackoverflow сказал мне, что мне нужно использовать формат JSON-P , что после исследования я и собираюсь сделать. (данные, представленные в JSON-P, предназначены для отображения некоторой информации, размещенной на моем сервере, на другом веб-сайте)

  1. Как вывести JSON-P с моего сервера? Это то же самое, что и функция json_encode из PHP

  2. Как мне спроектировать шаблон дерева для вывода JSON-P (вы знаете, как: ({"name": "foo", "id": "xxxxx", "blog": "http://xxxxxx.com"}); я могу украсть это из моего вывода XML? (http://bit.ly/9kzBDP)

  3. Каждый раз, когда посетитель просматривает веб-сайт, на котором находится мой виджет, он отправляет запрос на мой сервер, запрашивая данные JSON-P для отображения на стороне клиента. Это значительно увеличит нагрузку на процессор (1 посетитель на сайте, у которого будет скрипт = 1 SQL-запрос на моем сервере для вывода данных), поэтому есть ли способ «кэшировать» JSON-P выводит информацию , чтобы обновлять ее только один или два раза в день и сохранять в «файле» (в каком расширении?).

НО с другой стороны я бы сказал, что запрос данных JSON-P напрямую (без кэширования) является плюсом, потому что веб-сайты, которые будут интегрировать скрипт , хотят отображать только свои информация , а не все данные. Итак, создаем скрипт с чем-то вроде этого:

jQuery.getJSON("http://www.something.com/json-p/outpout?filter=5&callback=?", function(data) {
................);
});

Где filter = информация, которую хочет отобразить веб-сайт.

  • Дополнительный вопрос: должен ли я использовать JS-фреймворк для чтения JSON-P? или JS pure без каких-либо рамок для включения на страницу может это сделать?

Что ты думаешь?

Большое спасибо ;)

Ответы [ 2 ]

2 голосов
/ 18 апреля 2010

Вы можете использовать функцию json_encode, чтобы получить строковое представление объекта в формате JSON, а затем добавить заполнение вокруг него, например:

$json = json_encode($myObj);
echo $callback . "(" . $json . ");";

Большинство структур JSON тесно копируют XML-структуры и соглашения об именах. Отдельные узлы без потомков становятся свойствами, повторяющиеся узлы XML будут массивами JSON, а узлы с потомками - объектами. См. http://www.ajaxprojects.com/ajax/tutorialdetails.php?itemid=396 для приличного, параллельного просмотра данных, представленных в обоих форматах.

Что касается кэширования данных на сервере, большинство методов кэширования могут быть немного излишними, если ваш трафик не слишком большой. См. этот ответ на один из моих собственных вопросов и этот ответ с рекомендацией memcached , если вы все еще настаиваете, что он вам нужен. Вы можете использовать заголовок управления кэшем клиента expires, чтобы убедиться, что клиент извлекает данные только один раз, даже на нескольких страницах / обновлений.

Бонусный ответ: прелесть JSON-P в том, что вам не нужна никакая библиотека для ее анализа. Формат - чистый javascript, и добавить JSON-P на страницу так же просто, как добавить скрипт на страницу:

<script 
   type="text/javascript" 
   src="http://myurl.com/jsonp.php?callback=test&filter=5">
</script>
2 голосов
/ 18 апреля 2010

запрос JSONP

$.ajax({
  type: "get",
  dataType: "jsonp",
  url: "mothership.com/widget_data",
  data: {whatever: "here", requested_from: "someonesblog.com" },
  cache: true,
  success: function(data, textStatus, XMLHttpRequest){
    // respond to ajax call here

    // debug: make sure your data is getting loaded properly
    console.log(data);

    // do other necessary things here
  }
});

Кодирование и вывод JSON с сервера

<?php
  header("Content-Type: application/json");

  # You can access data from the jQuery.ajax() call with $_GET here

  $data = array(
    "name" => "foo",
    "id"   => 1234,
    "blog" => $_GET["requested_from"]
  );
  echo $_GET["callback"] . "(" . json_encode($data). ");" ;

  # this will output something like
  # jsonp1255285823({"name":"foo","id":1234,"blog":"someonesblog.com"});

  exit;
?>
...