Протокол HTTP

Протокол HTTP (англ. HyperText Transfer Protocol — «протокол передачі гіпертексту») дозволяє обмінюватися текстовою та іншою символьною інформацією. В даний час використовується для передачі довільних даних за схемою запит-відповідь. Основним призначенням протоколу HTTP є передача веб-сторінок (текстових файлів зі спеціальною розміткою, HTML, XML, CSS та ін.), у нашому випадку йдеться про запит та отримання XML файлів.

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

Лістинг №1 Приклад структури XML

Програма Silverlight може використовувати xml дані для побудови інтерфейсу користувача. Наприклад сервер може обробляти та зберігати дані отримані з кількох ресурсів, а програма Silverlight запитувати збережені дані надаючи яскраву візуальну інформацію користувачеві. Щоб заощаджувати обчислювальні ресурси сервера можна на сервері зберігати лише базові дані, а більшість обчислень виробляти машині клієнта. У прикріплених нижче вихідниках приклади використання дружнього протоколу HTTP для запиту даних у формі xml.

Для виконаннязапиту за протоколом HTTP даних у формі xml Silverlight пропонує високорівневі класиWebClient таHttpWebRequest. Обидва класи мають асинхронні методи запиту, які не блокують інтерфейс користувача.

Найпростіша реалізація роботи з HTTP цеклас WebClient. Щоб отримати вміст xml-файлу з сервера пропонуються інтуїтивно зрозумілі асинхронні методи DownloadStringAsync(), OpenReadAsync() у поєднанні з подіями закінчення запиту відповідно OnDownloadStringCompleted(), OnOpenReadCompleted(). Метод DownloadStringAsync(), як і видно з назви, починає завантаження рядкових даних, результат можна в події OnDownloadStringCompleted(). OpenReadAsync() призначений для отримання вхідного потоку у відповідній тандемній події OnOpenReadCompleted(). Дуже зручно, що клас WebClient перемикає події завершення запитів із додаткових потоків у контекст користувача, не вимагаючи підключення делегатів, тобто події OnDownloadStringCompleted() та OnOpenReadCompleted() завжди викликається в потоці інтерфейсу користувача.

Лістинг №2 Вихідний код на класі WebClient

Клас HttpWebRequest надає для запиту та отримання файлу xml такі методи роботи: запиту BeginGetResponse() та отримання результату EndGetResponse(). Програмам Silverlight немає сенсу використовувати синхронні методи і відповідно HttpWebRequest має лише асинхронну функціональність. Але, на відміну WebClient, асинхронка HttpWebRequest працює у додаткових потоках. Щоб коректно отримати доступ до результатів запиту, необхідно використовувати делегати та диспетчерську службу System.Windows.Threading.Dispatcher.

Лістинг №3 Вихідний код на класі HttpWebRequest

Вони обидва класи хороші для виконання запитів xml даних, хоча для запитів простіше використовувати більш високорівневий клас WebClient. HttpWebRequestмає більшу функціональність, більш зрозумілу роботу винятків, але складніше у використанні. Вибір залежить від рівня складності побудови http запитів. Чи не підійшов один клас, ніхто не забороняє використовувати інший.

Для обробки вхідного потоку xml даних у вихіднику застосовується швидкіснийXmlReader. Цей клас характеризується високою швидкістю читання xml документів.XmlReader читає дані безпосередньо з потоку, читає тільки вперед: прочитавши елемент, покажчик миттєво переміщається на наступний. Щоб ефективно використовувати XmlReader для своєї програми, необхідно точно знати xml структуру досліджуваного файлу. У вихідниках використано 3 ідентичні за структурою файли статистичні дані.

Лістинг №4 Обробка отриманого xml файлу