Освоєння Ajax: Частина 7. Використання XML у запитах і відповідях (вихідні коди)

Сьогодні неможливо створювати скільки-небудь значні програми без звернення до 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>

*

*