Изящная передача сложных данных по URL

Я думаю об использовании чего-то вроде:

<script src="http://www.example.com/?key={"param":"value"}">

Как вы можете видеть в приведенном выше примере, строка в формате JSON передается по URL-адресу источника. Пример, конечно, не работает, потому что и строка JSON, и тег script используют двойные кавычки.

Вот несколько решений, которые я могу придумать:

  1. Используйте одинарные кавычки в теге скрипта. Проблема - плохо выглядит на странице, где все остальные теги используют двойные кавычки.

  2. Используйте &quot; вместо ". Проблема в том, что URL-адрес src трудно читать.

  3. Используйте альтернативный формат обмена данными JSON, в котором не используются двойные кавычки. Проблема в том, что я не могу придумать хорошего кандидата.

Что вы думаете?


person Emanuil Rusev    schedule 22.12.2009    source источник


Ответы (5)


Вы должны использовать encodeUriComponent, а затем декодировать значение на сервере (какой язык вы используете на сервере?).

person Gabriel McAdams    schedule 22.12.2009
comment
Спасибо за отличное предложение! Однако я ищу решение, которое не использует JavaScript. - person Emanuil Rusev; 23.12.2009
comment
Я сделал предположение, что вы строите src с помощью javascript (это JSON). Если вы не используете javascript, то что вы используете? Это генерируется на сервере? Для чего это? (спрашиваю, потому что у меня может быть для вас другой вариант). - person Gabriel McAdams; 23.12.2009
comment
Теги сценария будут генерироваться флэш-приложением и использоваться для встраивания гаджетов/компонентов веб-сайта. Связь между flash-скриптом и javascript возможна, и в конечном итоге я мог бы использовать предложенный вами метод, но я бы предпочел решение без javascript. - person Emanuil Rusev; 23.12.2009
comment
ActionScript очень похож на JavaScript. То, что я предложил (encodeUriComponent), также доступно в ActionScript. - person Gabriel McAdams; 23.12.2009
comment
Вот ссылка на adobe.com для получения дополнительной информации о кодировании uri: livedocs.adobe .com/flash/9.0/ActionScriptLangRefV3/package.html - person Gabriel McAdams; 23.12.2009
comment
(краснеет) Я должен был это знать. Спасибо за вашу помощь! - person Emanuil Rusev; 23.12.2009

Насколько сложными должны быть данные? Если это просто пары ключ-значение, то почему бы не использовать обычную форму URL-кодирования?

<script src="http://www.example.com/?param=value&otherparam=othervalue">
person Brian Campbell    schedule 22.12.2009
comment
Это становится достаточно сложным. В какой-то момент это выглядит примерно так: {param:value,{[{param:value,param:value},{param:value,param:value}]}} - person Emanuil Rusev; 22.12.2009

Посмотрите, как устроены URL-адреса для Google Charts — они дают несколько полезных советов.

person sealclubber    schedule 22.12.2009

Другим вариантом было бы urlencode только часть JSON. Я не уверен, как вы создаете эти URL-адреса, но если это вручную, просто возьмите:

{
  "param": "value",
  {
    [{
      "param": "value",
      "param": "value"
    }, {
      "param": "value",
      "param": "value"
    }]
  }
}

И в Firebug вызовите "escape" для этой строки, что даст вам:

%7B%22param%22%3A%22value%22%2C%7B%5B%7B%22param%22%3A%22value%22%2C%22param%22%3A%22value%22%7D%2C%7B%22param%22%3A%22value%22%2C%22param%22%3A%22value%22%7D%5D%7D%7D

Таким образом, у вас будет URL-адрес сценария, например:

<script src="http://www.example.com/?key=%7B%22param%22%3A%22...

Эти процентные шестнадцатеричные коды возвращаются вашим веб-сервером в фактические байты, поэтому вы можете просто продолжить и проанализировать JSON-параметр «ключ» GET и получить красивую вложенную структуру хэша/массива.

person jpsimons    schedule 22.12.2009
comment
Спасибо! Это интересный подход. Однако для целей, о которых я спрашиваю, важно, чтобы URL-адрес легко читался людьми. - person Emanuil Rusev; 23.12.2009

В подобных решениях подходят одинарные кавычки, поэтому я бы рекомендовал это.

Преимущество этого решения в том, что оно отличает vars от HTML-атрибутов двойными кавычками.

person Dave Everitt    schedule 22.12.2009