Освоєння Ajax: Частина 7. Використання XML в запитах і відповідях (исходники), HTML, XML, DHTML, Інтернет-технології, статті

Сьогодні неможливо створювати скільки-небудь значні програми без звернення до XML. Будь ви розробником Web-сторінок, що обмірковує перехід до XHTML, Web-програмістом, які розробляють JavaScript, серверним програмістом, використовують дескриптори розгортання і прив’язку даних, або програмістом, що досліджує бази даних на основі XML, без розширюваного мови розмітки вам не обійтися. Тому не дивно, що XML вважається однією з кореневих технологій, які лежать в основі Ajax.


Однак, таку думку швидше відображає недостатній вибір імен для кореневого об’єкта, що використовується в Ajax-додатках – XMLHttpRequest – Чим технічну реальність. Іншими словами, більшість вважають XML кореневої частиною Ajax, так як вони припускають, що об’єкт XMLHttpRequest дійсно постійно використовує XML. Але це не так, і причини цього розглядаються в першій частині цієї статті. В дійсності, ви побачите, що в більшості Ajax-додатках XML взагалі рідко з’являється.


XML дійсно знаходить застосування в Ajax, і XMLHttpRequest також це допускає. Звичайно, ніщо не заважає вам відправити XML на сервер. У більш ранніх статтях цієї серії ви використовували нешифровані текст і параметри імені і значень для відсилаються даних, але XML-формат теж застосуємо. У цій статті ви дізнаєтеся, як це робити. І, що ще важливіше, ми поговоримо про те, чому ви можете застосовувати XML для формату ваших запитів, і чому у багатьох випадках вам не слід його застосувати.


XML: Чи є він взагалі?


Легко зробити припущення щодо Ajax-додатків і використання ними XML, і ім’я технології (Ajax), і використовується нею кореневої об’єкт (XMLHttpRequest) Вказують на використання XML, і ви будете чути, що XML постійно пов’язаний з Ajax-додатками. Проте таке сприйняття не так, а якщо ви дійсно захочете дізнатися, з чим саме ви працюєте при написанні асинхронних додатків, ви повинні знати, що це сприйняття невірно – але вам важливіше знати чому воно так.


XMLHttpRequest: Невдалі імена і HTTP


Найгірше, що може трапитися з технологією, це її зловживання до такої міри, що заміна її основних частин стає неможливою. Саме це сталося з XMLHttpRequest, Основним елементом, використовуваним в Ajax-додатках. Судячи з назви, він спроектований для відсилання XML по HTTP-запитах, чи, можливо, для створення HTTP-запитів в будь-якому XML-форматі. Як би ім’я об’єкта не звучало, все ж його реальна функція полягає в наданні способу для вашого клієнт-коду (зазвичай JavaScript на вашій Web-сторінці) для відсилання HTTP-запиту. Тільки це, і не більше того.


Отже, було б добре просто змінити ім’я XMLHttpRequest на що-небудь більш точне, наприклад HttpRequest, Або, можливо, просто Request. Проте, мільйони розробників зараз вводять Ajax в свої додатках, а так як ми всі знаємо, що потрібні роки – якщо не десятиліття – щоб більшість користувачів перейшло до нових версій браузерів, таких як Internet Explorer 7.0 або Firefox 1.5, такий перехід просто недоцільний. В результаті ви залишаєтеся з XMLHttpRequest, А розробникам тільки залишається визнати, що ім’я вибрано невдало.


Очевидно, що одним з найбільш відомих методів переходу на аварійний режим (fallback methods) при зверненні до браузеру (особливо на Windows), який не підтримує XMLHttpRequest, Є застосування Microsoft-об’єкта IFRAME. Чи схоже на XML, HTTP, або навіть на запит, чи не так? Очевидно, що всі ці елементи можуть бути включені, але важливо, щоб було ясно, що об’єкт XMLHttpRequest більшою мірою призначений для створення запитів без звернення до завантаження сторінки, ніж для XML, або навіть HTTP.


Запити робляться за допомогою HTTP, а не XML


Ще одним поширеним помилкою є припущення, що XML так чи інакше непомітно застосовується – точка зору, якої я і сам колись дотримувався, по правді кажучи! Проте, така точка зору свідчить про невірне розумінні даної технології. Коли користувач відкриває систему навігації (brouser) і запитує Web-сторінку з сервера, набирається щось на зразок http://www.google.com або http://www.headfirstlabs.com. Навіть якщо не включається http://, Браузер вставить цю частину в панель адреси системи. Ця перша частина – http:// – Це явний покажчик на те, як відбувається передача даних: через HTTP, протокол передачі гіпертексту (Hypertext Transfer Protocol). Коли ви записуєте код на вашій Web-сторінці, щоб зв’язатися з сервером, чи йде мова про застосування Ajax або про звичайну формі POST або навіть про гіперпосиланню, ви використовуєте HTTP.







 



HTTPS: як і раніше HTTP

Ті з вас, хто менш знайомий з Web можуть дивуватися таким уніфікованим вказівниками ресурсів (URLs), як https://intranet.nextel.com. Протокол https є надійним протоколом HTTP і просто застосовує більш надійну форму протоколу HTTP, використовуваного звичайними Web-запитами. Тому навіть з HTTPS ви все ще просто застосовуєте HTTP, хоча і з деякими додатковими рівнями захисту від сторонніх очей.


У зв’язку з тим, що вся Web-комунікація між браузерами і серверами відбувається за допомогою HTTP, уявлення про те, що XML якимось чином непомітно використовується XMLHttpRequest як технології або засоби передачі даних не відповідає дійсності. Звичайно можливо відправляти XML в HTTP-запиті, але HTTP є дуже точно визначеним стандартом, від якого в будь-який час без зусиль можна відмовитися. Якщо ви навмисно не використовуєте XML у вашому запиті, або якщо сервер не відправляє вам відповідь в XML, то в об’єкті XMLHttpRequest застосовуватиметься ніщо інше як простий старий HTTP. Тому наступного разу, коли хтось вам скаже, “Так, це називається XMLHttpRequest бо тут непомітно застосовується XML “, просто посміхніться і терпляче поясніть йому, що представляє собою HTTP, і поясніть, що поки XML можна відправляти через HTTP, XML є форматом даних, а не протоколом передачі даних. Ви обоє отримаєте вигоду з такого пояснення.


Застосування XML (насправді)


На цьому етапі я розповів вам про всі областях, де XML не використовується в Ajax. Але x в Ajax і XML в XMLHttpRequest все ж дуже реальні, і у вас є кілька опцій для використання XML у ваших Web-додатках. У цьому розділі ви дізнаєтеся про основні опціях, і потім ви зможете детально з ними ознайомитися в інших розділах даної статті.


Опції для XML


У ваших асинхронних додатках ви знайдете два основних застосування XML:



Перше застосування – для відправлення запиту в XML – вимагає, щоб ви формували ваш запит як XML, або застосовуючи для цього API, або просто пов’язуючи текст і потім відправляючи результат на сервер. В цьому способі головною розглянутої завданням є побудова запиту згідно правилам XML, так, щоб він був зрозумілий сервером. Отже, основна увага в дійсності приділяється XML-формату; у вас є дані, які ви хочете відправити, і ви тільки повинні представити їх в XML-вираженні. Інша частина цієї статті присвячена даному застосуванню XML в ваших Ajax-додатках.


Друге застосування – для отримання запиту в XML – вимагає, щоб ви отримали запит з сервера і витягли дані з XML (знову ж за допомогою API або більш грубим методом). В цьому випадку вашим завданням буде витяг отриманих з сервера даних з XML, щоб можна було їх використовувати конструктивно. Про це піде мова в наступній статті даної серії, де вам буде надана детальний опис даного питання.


Суворе застереження


Перш ніж детально розглядати використання XML, необхідно зробити невелике застереження: XML є великим повільним і громіздким формаотм. Як ви побачите в наступних розділах і в наступній статті даної серії, в цьому контексті є грунтовні причини для використання XML, і деякі переваги XML перед простими текстовими запитами та відповідями (особливо для відповідей). Однак, XML майже завжди займатиме більше простору і буде повільніше, ніж простий текст, тому що ви додаєте всі теги і семантику, необхідну для XML, у ваші повідомлення.


Якщо ви хочете написати блискавично швидке додаток, таке як настільне додаток, XML може виявитися не найкращою відправною точкою. Якщо ви почнете з простого тексту, і виявите особливу необхідність в застосуванні XML, це інша справа, а проте, якщо ви використовуєте XML з самого початку, ви майже напевно сповільніть відповідну реакцію вашого застосування. У більшості випадків швидше буде відправити простий текст – за допомогою пар ім’я / значення (name / value), наприклад name=jennifer – Чим перетворювати текст в XML, як у прикладі:






<name>jennifer</name>

Ви тільки уявіть всі ділянки, де застосування XML вимагає додаткового часу: надання тексту оболонки XML; відправка додаткової інформації (зауважте, що я не включаю сюди будь супутні елементи, XML-заголовок, або що-небудь, що буде частиною більш реалістичного запиту); синтаксичний аналіз XML сервером, створення відповіді, згортання відповіді назад в форрмат XML, і відправлення його назад на вашу Web-сторінку; і потім синтаксичний аналіз відповіді вашої сторінкою і, нарешті, використання його. Тому ознайомтеся з тим, коли застосовувати XML, але не думайте, що ваш додаток у багатьох ситуаціях буде працювати швидше; скоріше, це додасть гнучкості, про що ми зараз і поговоримо.


XML від клієнта до сервера


Давайте уявимо застосування XML в якості формату для пересилання даних від клієнта на сервер. Спочатку ви побачите як це виконати технічно, а потім приділіть трохи часу на вивчення доцільності застосування XML.


Пересилання пар ім’я / значення (name / value)


Приблизно 90% Web-додатків, які ви пишете, ви завершуєте парами ім’я / значення для відправлення на сервер. Наприклад, якщо користувач набирає своє ім’я та адресу в будь-якій формі на своїй Web-сторінці, ви можете отримати з форми приблизно такі дані:






firstName=Larry
lastName=Gullahorn
street=9018 Heatherhorn Drive
city=Rowlett
state=Texas
zipCode=75080

Якщо б ви використовували звичайний текст для пересилання цих даних на сервер, ви могли б застосувати код як в Лістингу 1.


Лістинг 1. Відправлення пар ім’я / значення у вигляді звичайного тексту





function callServer() { / / Отримуємо інформацію про місто і штаті з Web-форми
var firstName = document.getElementById(“firstName”).value;
var lastName = document.getElementById(“lastName”).value;
var street = document.getElementById(“street”).value;
var city = document.getElementById(“city”).value;
var state = document.getElementById(“state”).value;
var zipCode = document.getElementById(“zipCode”).value;
/ / Створюємо URL для з’єднання з
var url = “/scripts/saveAddress.php?firstName=” + escape(firstName) +
“&lastName=” + escape(lastName) + “&street=” + escape(street) +
“&city=” + escape(city) + “&state=” + escape(state) +
“&zipCode=” + escape(zipCode);
/ / Відкриваємо з’єднання з сервером
xmlHttp.open(“GET”, url, true);
/ / Встановлюємо функцію для запуску сервера, коли це виконано
xmlHttp.onreadystatechange = confirmUpdate;
/ / Відправляємо відповідь
xmlHttp.send(null);
}

Перетворення пар name / value в XML


Перше, що вам потрібно зробити, якщо ви хочете використовувати XML в якості формату таких даних, це створити небудь основний XML-формат для зберігання цих даних. Очевидно, ваші пари ім’я / значення можуть все перетворитися в XML-елементи, де ім’я елемента є ім’ям пари, а зміст елемента є значенням:






<firstName>Larry</firstName>
<lastName>Gullahorn</lastName>
<street>9018 Heatherhorn Drive</street>
<city>Rowlett</city>
<state>Texas</state>
<zipCode>75080</zipCode>

Звичайно, XML вимагає, щоб ви мали кореневої елемент, або, якщо ви просто працюєте з фрагментом документа (частина XML-документа), що охоплює елемент. Тому ви можете конвертувати вищенаведений XML-код у щось подібне:






<address>
<firstName>Larry</firstName>
<lastName>Gullahorn</lastName>
<street>9018 Heatherhorn Drive</street>
<city>Rowlett</city>
<state>Texas</state>
<zipCode>75080</zipCode>
</address>

Тепер ви готові створити цю структуру в вашому Web-клієнті, і відправити його на сервер … майже.


Передача даних вербального типу


Перш, ніж ви будете готові почати пересилати XML по мережі, вам необхідно упевнитися, що сервер і скрипт, на який ви посилаєте дані, дійсно допускає XML. Тепер багатьом з вас це може здатися зайвим і занадто очевидним, щоб надавати цьому особливого значеіе, але досить багато програмістів з меншим стажем припускають, що, якщо вони відправляють XML по мережі, він буде отриманий і витлумачений правильно.


В дійсності, ви повинні зробити два кроки, щоб упевнитися, що дані, які ви відправляєте в XML, будуть отримані правильно:



  1. Переконайтеся, що скрипт, на який ви посилаєте XML, допускає XML в якості формату даних.
  2. Переконайтеся, що скрипт допустить особливий XML-формат і структуру, в яких ви відправляєте дані.

Обидва кроку, ймовірно, зажадають від вас бесіди з людиною, отже, суворе застереження! А серйозно, якщо вам важливо вміти відправляти дані, такі як XML, більшість авторів скриптів будуть вам зобов’язані; тому просто знайти скрипт, який буде допускати XML, не повинно бути важким. Проте, вам ще потрібно впевнитися, що ваш формат відповідає тому, що вимагає скрипт. Наприклад, припустимо, що сервер приймає дані такого роду:






<profile>
<firstName>Larry</firstName>
<lastName>Gullahorn</lastName>
<street>9018 Heatherhorn Drive</street>
<city>Rowlett</city>
<state>Texas</state>
<zip-code>75080</zip-code>
</profile>

Нагадує вищевказаний XML, за винятком двох моментів:



  1. XML, що виходить від клієнта, поміщений усередині елемента адреса, Але сервер очікує, що дані будуть поміщені в елемент profile.
  2. XML, що виходить від клієнта, використовує елемент zipCode, Тоді як сервер очікує zip-код в елементі zip-code.

За великим рахунком, ці дійсно невеликі моменти представляють собою різницю між сервером, які приймають і обробляють ваші дані, і сервером, що зазнали збої і постачають вашу Web-сторінку – і, ймовірно, її користувачів – незрозумілим помилковим повідомлення відповідь. Тому ви повинні розгадувати, що очікує сервер, і зводити відправляються вами дані в цей формат. Після цього – і тільки після цього – ви готові зайнятися по-справжньому технічною стороною процесу передачі XML від клієнта на сервер.


Передача XML на сервер


Коли справа дійде до передачі XML на сервер, ви витратите більше кодування, щоб взяти дані і обернути їх у формат XML, ніж для фактичної передачі даних. Фактично, як тільки ваша XML-рядок готова для передачі не сервер, ви відправляєте її точно так, як ви послали б будь-який інший простий текст; перевірте Лістинг 2 щоб побачити це в дії.


Лістинг 2. Відправлення пар ім’я / значення в XML





function callServer() {
// Get the city and state from the Web form
var firstName = document.getElementById(“firstName”).value;
var lastName = document.getElementById(“lastName”).value;
var street = document.getElementById(“street”).value;
var city = document.getElementById(“city”).value;
var state = document.getElementById(“state”).value;
var zipCode = document.getElementById(“zipCode”).value;
var xmlString = “<profile>” +
” <firstName>” + escape(firstName) + “</firstName>” +
” <lastName>” + escape(lastName) + “</lastName>” +
” <street>” + escape(street) + “</street>” +
” <city>” + escape(city) + “</city>” +
” <state>” + escape(state) + “</state>” +
” <zip-code>” + escape(zipCode) + “</zip-code>” +
“</profile>”;
/ / Побудуємо URL для з’єднання
var url = “/scripts/saveAddress.php”;
/ / Відкриємо з’єднання з сервером
xmlHttp.open(“POST”, url, true);
/ / Повідомимо серверу, що ви посилаєте дані в форматі XML
xmlHttp.setRequestHeader(“Content-Type”, “text/xml”);
/ / Встановимо функцію запуску сервера, коли це виконано
xmlHttp.onreadystatechange = confirmUpdate;
/ / Відправимо замовлення
xmlHttp.send(xmlString);
}

Більшість з цього зрозуміло без пояснень, лише кілька моментів варто відзначити. По-перше, дані у вашому запиті повинні бути вручну відформатовані як XML. Це невеликий крок назад після трьох статей по використанню Document Object Model, чи не так? А так як ніщо не забороняє вам застосовувати DOM для створення XML-документа за допомогою JavaScript, вам тоді доведеться перевести той DOM-об’єкт в текст, перш ніж відправляти його по мережі з GET або POST-запитом. Тому виявляється легше просто відформатувати дані за допомогою звичайної строкової маніпуляції. Звичайно, це створює можливість допущення помилок або друкарських помилок, тому вам потрібно бути особливо уважними при запису коду, щодо XML.


Як тільки ви сконструювали ваш XML, ви відкриваєте з’єднання в більшій мірі тим же способом, що і при пересилання тексту. Я віддаю перевагу застосовувати POST-запити для XML, так як деякі браузери накладають обмеження по протяжності на ланцюжка GET-запиту, а XML може ставати досить довгим, і ви побачите, що Лістинг 2 перемикається від GET до POST відповідно. До того ж, XML переважно пересилається за допомогою методу send(), А не як параметр, прикріплений на кінці URL, який ви запитуєте. В цьому і полягають все досить тривіальні відмінності, до яких легко пристосуватися.


Вам, правда, доведеться записати абсолютно новий рядок коду:






xmlHttp.setRequestHeader(“Content-Type”, “text/xml”);

Її неважко зрозуміти: вона просто повідомляє серверу, що ви відправляєте її як XML, а не як прості старі пари name / value. У будь-якому випадку, ви відправляєте дані як текст, але застосовуєте тут text/xml, Або XML, відправлений як звичайний текст. Якщо ви просто використовували пари name / value, рядок буде такий:






xmlHttp.setRequestHeader(“Content-Type”, “text/plain”);

Якщо ви забули повідомити серверу, що ви посилаєте її як XML, ви опинитеся в скруті, тому не забувайте цей крок.


Як тільки ви все це складете, все, що вам потрібно буде зробити, це викликати send() і передати його в XML-рядку. Сервер отримає ваш XML-запит, і (припускаючи, що ви виполнлі всю попередню роботу) прийме XML, розшифрує його й відправить вам відповідь. От і все, що потрібно зробити – XML-запити всього лише з декількома змінами в коді.


Відправлення XML: за і проти?


Перш ніж ви покинете XML-запити (і цю статтю) і перейдете до XML-відповідей, давайте поміркуємо, наскільки розумно застосовувати XML в ваших запитах. Я вже згадував, що XML ніяк не може вважатися самим швидкісним форматом даних щодо передачі, але крім цього є над чим подумати.


Не просто сконструювати XML


Перше, що вам потрібно зрозуміти, це те, що XML не так-то просто сконструювати для застосування в запитах. Як ви бачили в Лістингу 2, Ваші данн швидко стають занадто мудрими через семантики XML:






var xmlString = “<profile>” +
” <firstName>” + escape(firstName) + “</firstName>” +
” <lastName>” + escape(lastName) + “</lastName>” +
” <street>” + escape(street) + “</street>” +
” <city>” + escape(city) + “</city>” +
” <state>” + escape(state) + “</state>” +
” <zip-code>” + escape(zipCode) + “</zip-code>” +
“</profile>”;

Може здатися, що в цьому немає нічого поганого, але це XML-фрагмент, який має лише шість полів. Більшість Web-форм, які ви будете розробляти, будуть мати від десяти до п’ятнадцяти; хоча ви не будете застосовувати Ajax для всіх ваших запитів, над цим варто замислитися. Ви витрачаєте, принаймні, стільки ж часу, займаючись кутовими дужками й іменами тегів, скільки ви витрачаєте на дійсні дані, а можливість зробити помилки – величезна.


Є тут ще одна проблема – як уже зазначалося – в тому, що вам доведеться конструювати цей XML вручну. Застосування DOM не є хорошим варіантом, так як немає хороших простих способів звернути DOM-об’єкт в рядок, яку ви можете надіслати в якості запиту. Тому робота з подібними рядками є дійсно найкращим варіантом, але це також варіант, який найважче супроводжувати (Обслуговувати) і найважче зрозуміти новим розробникам. У цьому сдучае ви сконструювали весь XML в одному рядку; все стає набагато заплутаніше, коли ви робите це в кілька кроків.


XML не додає нічого до вашим запитам


Крім проблеми заплутаності, застосування XML для ваших запитів в дійсності не пропонує вам великих переваг – якщо взагалі вони є – у порівнянні зі звичайним текстом і парами name / value. Майте на увазі, що все в цій статті націлене на взяття тих же самих даних, які ви могли б вже відправити, застосовуючи пари ім’я / значення (зверніться до Лістингу 1) І передачу їх за допомогою XML. Ніде нічого не говорилося про дані, які можна отпраляєтся за допомогою XML, і які було б неможливо відправляти, використовуючи звичайний текст; це тому, що майже ніколи немає нічого, що можна відправити за допомогою XML, що не можна було б відправити, використовуючи звичайний текст.


Ось, власне, і все, що стосується XML і запитів: на їхню користь досить рідко виникають переконливі доводи. У наступній статті цієї серії ви побачите, що сервер може застосовувати XML для того, що набагато важче виконати, якщо використовувати звичайний текст, але це не стосується запитів. Тому якщо ви не маєте справу зі скриптом, який допускає тільки XML (а є й такі), вам безпечніше використовувати звичайний текст майже у всіх ситуаціях при передачі запитів.


Висновок


Вам тепер, безумовно, здається, що ви знаєте, як починати працювати з XML в Ajax. Ви знаєте, що Ajax-додатки не повинні застосовувати XML, і що XML не є свого роду чудодійним засобом для передачі даних. Вам також має бути досить комфортно пересилати XML з Web-сторінки на сервер. Що ще важливіше, ви знаєте, що сервер буде дійсно працювати і відповідати на ваші запити: ви повинні упевнитися, що серверний скрипт допускає XML, і що допускає його в форматі, який ви використовуєте для пересилання даних.


Ви також повинні чітко усвідомлювати, чому XML – не завжди хороший вибір як формат даних для запитів. У наступних статтях, ви ознайомитеся з деякими випадками, коли це допомагає, але в більшості запитах він просто уповільнює та ускладнює роботу. Тому, хоча я б звичайно пропонував, щоб ви відразу приступали до застосування за все, чого ви навчилися в статті, я замість цього пораджу вам бути обережними в застосуванні отриманих даних в даній статті. XML-запити знаходять свою область застосування в Ajax-додатках, але ця область не така велика, як ви можете собі уявляти.


У наступній статті цієї серії, ви дізнаєтеся, як сервери можуть відповідати за допомогою XML, і як ваші Web-додатки можуть працювати з цими відповідями. На щастя, є набагато більше причин, щоб сервер надсилав XML назад в Web-додаток, ніж навпаки, тому ви отримаєте навіть більше користі з технічних деталей статті; а тепер, упевніться, що ви розумієте, чому XML не завжди доцільний – по крайней мере, для відправлення запитів. Можливо, ви навіть захочете спробувати виконати деякі Web-додатки за допомогою XML в якості формату даних для запитів, і потім конвертувати назад у звичайний текст, і подивитися, що швидше і легше для вас. Я ще побачуся з вами в мережі до опублікування наступній статті.


Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*