Javascript.RU

Форматы данных для AJAX

Существует несколько распространенных форматов общения с сервером.

Рассмотрим

  • HTML
  • XML
  • JSON

В самом простом случае - ответом на AJAX-запрос является кусок HTML:

<h4>Готово</h4>
<p class="notification">Новость опубликована</p>

Этот кусок можно показать пользователю, записав внутрь тага:

domObject.innerHTML = data
  • Не требует дополнительной обработки
  • Разметка может давать большой объем
  • Ограниченное применение. Это часть документа, а не данные
  • Иногда возникают проблемы с формами, создаваемыми через innerHTML (не отсылаются, некорректно показываются и т.п.)

Сервер возвращает XML document типа:

<response>
<status>Готово</status>
<message>Новость опубликована</message>
</response>

На клиенте XML может либо анализироваться через javascript, либо преобразовываться XSL-шаблоном типа:

<xsl:template match="/reports/report">
<h4><xsl:value-of select="status"/></h4>
<p class="notification"><xsl:value-of select="message"/></p>
</xsl:template>

Код на клиенте:

// ... получить XML-ответ в xmlDoc и подготовить XSLT в xslDoc
domObject.innerHTML = xmlDoc.transformNode(xslDoc)

На практике, поддержка XSLT в браузерах очень ограничена и различается в деталях. Завязавшись на обработку XML при помощи client-side XSLT, рано или поздно придется все же использовать javascript из-за ограничений XSLT.
Также браузером не поддерживается EXSLT.

Плюсом XSLT является быстрота метода, по сравнению с javascript, но это актуально лишь на больших документах.

  • Работа с DOM/XSLT/XPath
  • Давно известный и широко используемый формат:огромное количество стандартных сервисов и известных классов отдают информацию в XML-формате
  • Большие ограничения XSLT
  • Обязателен дополнительный фреймворк для кросс-браузерного XSLT
  • XPath - не во всех браузерах

Этот формат, как правило, самый оптимальный. Сервер возвращает JavaScript-объект:

{"response":
{"status":"Готово","message":"Новость опубликована"}
}

Чтобы десериализовать объект, клиент просто пропускает текст через встроенный парсер, добавив скобки

var reports = eval( '('+data+')' )

Затем HTML может быть сформирован средствами JavaScript, собственной шаблонной системой и т.п.

domObject.innerHTML = jSmarty.fetch(reportsTemplate)

Конечно же, eval позволяет не только десериализовать JSON-объекты, но и выполнять произвольный JS-код.

Если есть подозрения, что данные с сервера(например, вызов внешнего вебсервиса) могут быть небезопасны, то их можно проверить на соответствие JSON регулярным выражением:

var my_JSON_object =
!(/[^,:{}[]0-9.-+Eaeflnr-u nrt]/.test(data.replace(/"(.|[^"])*"/g, ''))) &&
eval('(' + data + ')')
  • Формат самый неудобочитаемый, сложно заметить ошибку на глаз
  • Существуют парсеры/сериализаторы, для php есть pear-класс и pecl-extension.
  • Менее избыточен, по сравнению с XML и HTML
  • eval(), как правило, работает достаточно быстро

Надеюсь, будут полезны наблюдения:

  • Для небольшого внедрения AJAX в существующее приложение удобен HTML-формат. Известные библиотеки (jpspan, sajax, xajax...) делают работу с ним очень простой. Кроме того, HTML не требует клиентского кода.
  • XML является стандартом де-факто для множества приложений.
    Так что работать с ним, вполне возможно, придется вне зависимости от пристрастий разработчиков.
  • XML может быть намного проще, чем JavaScript-объекты, так как доступны сложные XPath-выборки. Для JavaScript менее мощные способы выборки есть во фреймворках: dojo,jQuery и т.п.
  • JSON удобен, когда нужно переслать данные, и непосредственная переработка данных в HTML не нужна.
  • При выборке-отображении большого количества данных (начиная с десятков записей) XML+XSLT может работать быстрее. Например, это может быть существенно для больших таблиц.

Вообще,в разных частях веб-приложения вполне можно использовать несколько форматов. Например:

  1. XML для AJAX-подгрузки ленты новостей
  2. JSON для работы с узлами JavaScript-дерева
  3. HTML для модулей, которые слабо адаптированы под работу в режиме сервиса

Автор: e-FreeZe (не зарегистрирован), дата: 9 октября, 2008 - 17:54
#permalink

В общем, спасибо за статью - довольно познавательно.
Я давно уже пишу для веб, но только не давно решил разобраться в новых технологиях, и ajax - первая из них (тем более что и так давненько читал про нее)


Автор: Хаён (не зарегистрирован), дата: 16 октября, 2008 - 14:40
#permalink

Да, сайт полезный! Особенно порадовали тесты.


Автор: Владимир Зайцев (не зарегистрирован), дата: 10 ноября, 2008 - 17:39
#permalink

Присоединяюсь к благодарностям!
Нельзя ли осветить еще вариант SOAP?


Автор: Илья Кантор, дата: 21 января, 2009 - 21:53
#permalink

SOAP - надстройка над XML. Никаких встроенных языковых средств для его обработки нет.. Да и вообще, не популярен он на клиент-сайде...


Автор: B~Vladi, дата: 5 августа, 2009 - 15:18
#permalink

При выборке-отображении большого количества данных (начиная с десятков записей) XML+XSLT может работать быстрее. Например, это может быть существенно для больших таблиц.

Значит я сделал правельный выбор:)


Автор: Max-Tryk (не зарегистрирован), дата: 1 сентября, 2009 - 17:51
#permalink

Статьи прикольные на сайте, но коменты к ним пишет один и тот же чел. Не будем показывать пальцами...


Автор: subzey, дата: 25 декабря, 2009 - 10:36
#permalink

Добавьте, пожалуйста экранирование в регулярку-проверку json, кажется, его порезало.


Автор: SMakS (не зарегистрирован), дата: 13 октября, 2012 - 18:18
#permalink

Помогите, пожалуйста, есть скрипт, который принимает JSON с сервера, сам JSON приходит в таком виде:
[{"id":"1","body":"sometext"},{"id":"2","body":"sometext2"}]
Делаю
JSON.parse(здесь_пришедший_JSON) или eval('('+здесь_пришедший_JSON+')')
И браузер начинает выводить
[object Object],[object Object]
Объясните, пожалуйста, как вставить значения body разных записей в html код? Заранее спасибо!


Автор: Гость (не зарегистрирован), дата: 14 ноября, 2012 - 17:15
#permalink

"[{"id":"1","body":"sometext"},{"id":"2","body":"sometext2"}]"

Попробуй на сервере сформировать массив вида [{"id":"body","id1":"body1" и т.д.}]
и парсь


Автор: Гость, дата: 14 января, 2013 - 11:48
#permalink

eval( '(' +request.responseText+ ')' )
Для чего нужны эти скобки?
Без них не работает, но почему?


Автор: Гость (не зарегистрирован), дата: 18 апреля, 2013 - 14:08
#permalink

Всё дело в том, что в JavaScript с фигурной скобки { начинаются и объекты и блоки кода. Если передать в eval объект напрямую, то он подумает, что первая "{" начинает блок кода:

{
"name": "Вася",
"age": 25
}

Выполнение такого кода, конечно, приведёт к ошибке.

А если eval получает выражение в скобках ( ... ), то интерпретатор точно знает, что блока кода внутри быть не может, значит это объект.


Автор: Гость (не зарегистрирован), дата: 14 августа, 2013 - 15:27
#permalink

Пожалуйста, если не затруднит.
Приведите пример перевода минут в часы, в формате HH:MM на JS.
Для Adobe Acrobat.
Я чайник и впервые столкнулся с подобной задачей.
Огромное спасибо!


Автор: Гость (не зарегистрирован), дата: 21 августа, 2013 - 05:52
#permalink

Кода!
Решение найдено.


Автор: Гость (не зарегистрирован), дата: 22 августа, 2013 - 01:20
#permalink

Фигня всё... Работает и без скобок () прекрасно! В принципе пересылать JSON формат можно и без внешних скобок, фигурных или квадратных, только внутренность. Но надо не забывать их перед распарсиванием ставить. Вот в этом случае они обязательны ибо определяют суть! А вообще для Ajax есть вызов AJAX.parse(text).


Автор: vopana (не зарегистрирован), дата: 29 января, 2020 - 15:30
#permalink

I have not any word to appreciate this post.....Really i am impressed from this post....the person who create this post it was a great human..thanks for shared this with us.


Автор: Гость (не зарегистрирован), дата: 8 февраля, 2020 - 16:14
#permalink

Nice Informative Blog having nice sharing..
click this site


Автор: johnb6 (не зарегистрирован), дата: 22 февраля, 2020 - 18:19
#permalink

I admire what you have done here. I like the part where you say you are doing this to give back but I would assume by all the comments that this is working for you as well.
Arrhythmia


Автор: johnb (не зарегистрирован), дата: 23 февраля, 2020 - 14:06
#permalink

Thanks for a wonderful share. Your article has proved your hard work and experience you have got in this field. Brilliant .i love it reading.
bee hive removal


Автор: johnb (не зарегистрирован), дата: 25 февраля, 2020 - 13:07
#permalink

Thank you for taking the time to publish this information very useful!
https://trulylovelykitchen.com


Автор: johnb (не зарегистрирован), дата: 28 февраля, 2020 - 21:48
#permalink

I really appreciate the kind of topics you post here. Thanks for sharing us a great information that is actually helpful. Good day!
celebrity leather jackets


Автор: johnsa (не зарегистрирован), дата: 29 февраля, 2020 - 22:46
#permalink

You know your projects stand out of the herd. There is something special about them. It seems to me all of them are really brilliant!
3D printer australia


Автор: johnb (не зарегистрирован), дата: 3 марта, 2020 - 00:06
#permalink

Please continue this great work and I look forward to more of your awesome blog posts.
Geelong glass


Автор: john bond (не зарегистрирован), дата: 12 марта, 2020 - 13:17
#permalink

This is my first time visit here. From the tons of comments on your articles,I guess I am not only one having all the enjoyment right here!
duty to manage asbestos


Автор: johnb (не зарегистрирован), дата: 14 марта, 2020 - 10:19
#permalink

This is a great inspiring article.I am pretty much pleased with your good work.You put really very helpful information. Keep it up. Keep blogging. Looking to reading your next post.
bot ngu coc la gi


Автор: john bond (не зарегистрирован), дата: 14 марта, 2020 - 13:12
#permalink

Thank you for such a well written article. It’s full of insightful information and entertaining descriptions. Your point of view is the best among many.
Smart Wireless Meat Thermometers


Автор: luo (не зарегистрирован), дата: 17 марта, 2020 - 12:39
#permalink

I have a lot of knowledge from what you share, to say thank you, the information and knowledge here helps me a lot happy wheels


Автор: john bond (не зарегистрирован), дата: 21 марта, 2020 - 13:29
#permalink

Excellent information on your blog, thank you for taking the time to share with us. Amazing insight you have on this, it's nice to find a website that details so much information about different artists.
solar panel oakland


Автор: johnb (не зарегистрирован), дата: 21 марта, 2020 - 18:10
#permalink

Positive site, where did u come up with the information on this posting?I have read a few of the articles on your website now, and I really like your style. Thanks a million and please keep up the effective work.
asphalt paving


Автор: farhan (не зарегистрирован), дата: 22 марта, 2020 - 15:24
#permalink

Friend, this web site might be fabolous, i just like it.
streaming tv


Автор: john bond (не зарегистрирован), дата: 23 марта, 2020 - 13:50
#permalink

This is truly a great read for me. I have bookmarked it and I am looking forward to reading new articles. Keep up the good work!.
klinikáknak is


Автор: john bond (не зарегистрирован), дата: 23 марта, 2020 - 20:28
#permalink

nice post, keep up with this interesting work. It really is good to know that this topic is being covered also on this web site so cheers for taking time to discuss this!
Barber Camberwell


Автор: john bond (не зарегистрирован), дата: 26 марта, 2020 - 12:31
#permalink

You’ve got some interesting points in this article. I would have never considered any of these if I didn’t come across this. Thanks!.
flowchart


Автор: john bond (не зарегистрирован), дата: 26 марта, 2020 - 12:48
#permalink

I admire what you have done here. I like the part where you say you are doing this to give back but I would assume by all the comments that this is working for you as well.
Best Digital Notepads


Автор: johnss (не зарегистрирован), дата: 27 марта, 2020 - 14:52
#permalink

I have not any word to appreciate this post.....Really i am impressed from this post....the person who create this post it was a great human..thanks for shared this with us.
the corona virus


Автор: john bond (не зарегистрирован), дата: 29 марта, 2020 - 10:56
#permalink

This is my first time visit here. From the tons of comments on your articles,I guess I am not only one having all the enjoyment right here!
webdesign


Автор: john bond (не зарегистрирован), дата: 31 марта, 2020 - 12:01
#permalink

Interesting and amazing how your post is! It Is Useful and helpful for me That I like it very much, and I am looking forward to Hearing from your next..
bars near me current location


Автор: CVC (не зарегистрирован), дата: 1 апреля, 2020 - 00:35
#permalink

Awesome info, appreciate the tips.

Barbados SEO


Автор: quotedb (не зарегистрирован), дата: 1 апреля, 2020 - 00:40
#permalink

I find Javascript and ajax is very important, had issues recently and couldn't upload anything to Pinterest.
George Washington


Автор: pevedob (не зарегистрирован), дата: 3 апреля, 2020 - 11:38
#permalink

i read a lot of stuff and i found that the way of writing to clearifing that exactly want to say was very good so i am impressed and ilike to come again in future..
Barbados Web Design


Автор: peved (не зарегистрирован), дата: 4 апреля, 2020 - 18:23
#permalink

This type of message always inspiring and I prefer to read quality content, so happy to find good place to many here in the post, the writing is just great, thanks for the post.
Vegan Cake Recipes


Автор: peved (не зарегистрирован), дата: 7 апреля, 2020 - 12:29
#permalink

Really a great addition. I have read this marvelous post. Thanks for sharing information about it. I really like that. Thanks so lot for your convene.
best freelance gigs here


Автор: johnb6174 (не зарегистрирован), дата: 9 апреля, 2020 - 17:31
#permalink

Superbly written article, if only all bloggers offered the same content as you, the internet would be a far better place..
Lawrenceville GA Painter


Автор: osama shk (не зарегистрирован), дата: 12 апреля, 2020 - 22:20
#permalink

Thank you for such a well written article. It’s full of insightful information and entertaining descriptions. Your point of view is the best among many.
best dog boxes


Автор: usd to inr (не зарегистрирован), дата: 26 апреля, 2020 - 21:08
#permalink

I am no expert, but I believe you just made an excellent point. You certainly fully understand what you are speaking about, and I can truly get behind that.


Автор: usd to inr (не зарегистрирован), дата: 26 апреля, 2020 - 21:16
#permalink

Superbly written article, if only all bloggers offered the same content as you, the internet would be a far better place..


Автор: cyfgsciq (не зарегистрирован), дата: 17 мая, 2020 - 04:21
#permalink

Wonderful article, thanks for putting this together! This is obviously one great post. Thanks for the valuable information and insights you have so provided here.


Автор: cyfgsci (не зарегистрирован), дата: 17 мая, 2020 - 04:24
#permalink

I really appreciate the kind of topics you post here. Thanks for sharing us a great information that is actually helpful. Good day!
moroccan decor


Отправить комментарий

Приветствуются комментарии:
  • Полезные.
  • Дополняющие прочитанное.
  • Вопросы по прочитанному. Именно по прочитанному, чтобы ответ на него помог другим разобраться в предмете статьи. Другие вопросы могут быть удалены.
    Для остальных вопросов и обсуждений есть форум.
P.S. Лучшее "спасибо" - не комментарий, как все здорово, а рекомендация или ссылка на статью.
Содержание этого поля является приватным и не предназначено к показу.
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Разрешены HTML-таги: <strike> <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd> <u> <i> <b> <pre> <img> <abbr> <blockquote> <h1> <h2> <h3> <h4> <h5> <p> <div> <span> <sub> <sup>
  • Строки и параграфы переносятся автоматически.
  • Текстовые смайлы будут заменены на графические.

Подробнее о форматировании

CAPTCHA
Антиспам
14 + 5 =
Введите результат. Например, для 1+3, введите 4.
 
Текущий раздел
Поиск по сайту
Содержание

Учебник javascript

Основные элементы языка

Сундучок с инструментами

Интерфейсы

Все об AJAX

Оптимизация

Разное

Дерево всех статей

Последние комментарии
Последние темы на форуме
Forum