Генерация XML запроса к серверу и парсинг ответа


Содержание

Основы XMLHttpRequest

Материал на этой странице устарел, поэтому скрыт из оглавления сайта.

Более новая информация по этой теме находится на странице https://learn.javascript.ru/xmlhttprequest.

Объект XMLHttpRequest (или, как его кратко называют, «XHR») даёт возможность из JavaScript делать HTTP-запросы к серверу без перезагрузки страницы.

Несмотря на слово «XML» в названии, XMLHttpRequest может работать с любыми данными, а не только с XML.

Использовать его очень просто.

Пример использования

Как правило, XMLHttpRequest используют для загрузки данных.

Для начала посмотрим на пример использования, который загружает файл phones.json из текущей директории и выдаёт его содержимое:

Далее мы более подробно разберём основные методы и свойства объекта XMLHttpRequest , в том числе те, которые были использованы в этом коде.

Настроить: open

Этот метод – как правило, вызывается первым после создания объекта XMLHttpRequest .

Задаёт основные параметры запроса:

method – HTTP-метод. Как правило, используется GET либо POST, хотя доступны и более экзотические, вроде TRACE/DELETE/PUT и т.п.

URL – адрес запроса. Можно использовать не только http/https, но и другие протоколы, например ftp:// и file:// .

При этом есть ограничения безопасности, называемые «Same Origin Policy»: запрос со страницы можно отправлять только на тот же протокол://домен:порт , с которого она пришла. В следующих главах мы рассмотрим, как их можно обойти.

async – если установлено в false , то запрос производится синхронно, если true – асинхронно.

«Синхронный запрос» означает, что после вызова xhr.send() и до ответа сервера главный поток будет «заморожен»: посетитель не сможет взаимодействовать со страницей – прокручивать, нажимать на кнопки и т.п. После получения ответа выполнение продолжится со следующей строки.

«Асинхронный запрос» означает, что браузер отправит запрос, а далее результат нужно будет получить через обработчики событий, которые мы рассмотрим далее.

  • user , password – логин и пароль для HTTP-авторизации, если нужны.

Заметим, что вызов open , в противоположность своему названию ( open – англ. «открыть») не открывает соединение. Он лишь настраивает запрос, а коммуникация инициируется методом send .

Отослать данные: send

Именно этод метод открывает соединение и отправляет запрос на сервер.

В body находится тело запроса. Не у всякого запроса есть тело, например у GET-запросов тела нет, а у POST – основные данные как раз передаются через body .

Отмена: abort

Вызов xhr.abort() прерывает выполнение запроса.

Ответ: status, statusText, responseText

Основные свойства, содержащие ответ сервера:

status HTTP-код ответа: 200 , 404 , 403 и так далее. Может быть также равен 0 , если сервер не ответил или при запросе на другой домен. statusText Текстовое описание статуса от сервера: OK , Not Found , Forbidden и так далее. responseText Текст ответа сервера.

Есть и ещё одно свойство, которое используется гораздо реже:

Если сервер вернул XML, снабдив его правильным заголовком Content-type: text/xml , то браузер создаст из него XML-документ. По нему можно будет делать запросы xhr.responseXml.querySelector(«. «) и другие.

Оно используется редко, так как обычно используют не XML, а JSON. То есть, сервер возвращает JSON в виде текста, который браузер превращает в объект вызовом JSON.parse(xhr.responseText) .

Синхронные и асинхронные запросы

Если в методе open установить параметр async равным false , то запрос будет синхронным.

Синхронные вызовы используются чрезвычайно редко, так как блокируют взаимодействие со страницей до окончания загрузки. Посетитель не может даже прокручивать её. Никакой JavaScript не может быть выполнен, пока синхронный вызов не завершён – в общем, в точности те же ограничения как alert .

Если синхронный вызов занял слишком много времени, то браузер предложит закрыть «зависшую» страницу.

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

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

Для того, чтобы запрос стал асинхронным, укажем параметр async равным true .

Если в open указан третий аргумент true (или если третьего аргумента нет), то запрос выполняется асинхронно. Это означает, что после вызова xhr.send() в строке (1) код не «зависает», а преспокойно продолжает выполняться, выполняется строка (2) , а результат приходит через событие (3) , мы изучим его чуть позже.

Полный пример в действии:

Событие readystatechange

Событие readystatechange происходит несколько раз в процессе отсылки и получения ответа. При этом можно посмотреть «текущее состояние запроса» в свойстве xhr.readyState .

В примере выше мы использовали только состояние 4 (запрос завершён), но есть и другие.

Запрос проходит их в порядке 0 → 1 → 2 → 3 → … → 3 → 4 , состояние 3 повторяется при каждом получении очередного пакета данных по сети.

Пример ниже демонстрирует переключение между состояниями. В нём сервер отвечает на запрос digits , пересылая по строке из 1000 цифр раз в секунду.

При состоянии readyState=3 (получен очередной пакет) мы можем посмотреть текущие данные в responseText и, казалось бы, могли бы работать с этими данными как с «ответом на текущий момент».

Однако, технически мы не управляем разрывами между сетевыми пакетами. Если протестировать пример выше в локальной сети, то в большинстве браузеров разрывы будут каждые 1000 символов, но в реальности пакет может прерваться на любом байте.

Чем это опасно? Хотя бы тем, что символы русского языка в кодировке UTF-8 кодируются двумя байтами каждый – и разрыв может возникнуть между ними.

Получится, что при очередном readyState в конце responseText будет байт-полсимвола, то есть он не будет корректной строкой – частью ответа! Если в скрипте как-то по-особому это не обработать, то неизбежны проблемы.

HTTP-заголовки

XMLHttpRequest умеет как указывать свои заголовки в запросе, так и читать присланные в ответ.

Для работы с HTTP-заголовками есть 3 метода:

Устанавливает заголовок name запроса со значением value .

Нельзя установить заголовки, которые контролирует браузер, например Referer или Host и ряд других (полный список тут).

Это ограничение существует в целях безопасности и для контроля корректности запроса.

Особенностью XMLHttpRequest является то, что отменить setRequestHeader невозможно.

Повторные вызовы лишь добавляют информацию к заголовку, например:

Возвращает значение заголовка ответа name , кроме Set-Cookie и Set-Cookie2 .

Возвращает все заголовки ответа, кроме Set-Cookie и Set-Cookie2 .

Заголовки возвращаются в виде единой строки, например:

Между заголовками стоит перевод строки в два символа «\r\n» (не зависит от ОС), значение заголовка отделено двоеточием с пробелом «: » . Этот формат задан стандартом.

Таким образом, если хочется получить объект с парами заголовок-значение, то эту строку необходимо разбить и обработать.

Таймаут

Максимальную продолжительность асинхронного запроса можно задать свойством timeout :

При превышении этого времени запрос будет оборван и сгенерировано событие ontimeout :

Полный список событий

Современная спецификация предусматривает следующие события по ходу обработки запроса:

  • loadstart – запрос начат.
  • progress – браузер получил очередной пакет данных, можно прочитать текущие полученные данные в responseText .
  • abort – запрос был отменён вызовом xhr.abort() .
  • error – произошла ошибка.
  • load – запрос был успешно (без ошибок) завершён.
  • timeout – запрос был прекращён по таймауту.
  • loadend – запрос был завершён (успешно или неуспешно)

Используя эти события можно более удобно отслеживать загрузку ( onload ) и ошибку ( onerror ), а также количество загруженных данных ( onprogress ).

Ранее мы видели ещё одно событие – readystatechange . Оно появилось гораздо раньше, ещё до появления текущего стандарта.

В современных браузерах от него можно отказаться в пользу других, необходимо лишь, как мы увидим далее, учесть особенности IE8-9.

IE8,9: XDomainRequest

В IE8 и IE9 поддержка XMLHttpRequest ограничена:

  • Не поддерживаются события, кроме onreadystatechange .
  • Некорректно поддерживается состояние readyState = 3 : браузер может сгенерировать его только один раз во время запроса, а не при каждом пакете данных. Кроме того, он не даёт доступ к ответу responseText до того, как он будет до конца получен.

Дело в том, что, когда создавались эти браузеры, спецификации были не до конца проработаны. Поэтому разработчики браузера решили добавить свой объект XDomainRequest , который реализовывал часть возможностей современного стандарта.

А обычный XMLHttpRequest решили не трогать, чтобы ненароком не сломать существующий код.

Мы подробнее поговорим про XDomainRequest в главе XMLHttpRequest: кросс-доменные запросы. Пока лишь заметим, что для того, чтобы получить некоторые из современных возможностей в IE8,9 – вместо new XMLHttpRequest() нужно использовать new XDomainRequest .

Теперь в IE8,9 поддерживаются события onload , onerror и onprogress . Это именно для IE8,9. Для IE10 обычный XMLHttpRequest уже является полноценным.

IE9- и кеширование

Обычно ответы на запросы XMLHttpRequest кешируются, как и обычные страницы.

Но IE9- по умолчанию кеширует все ответы, не снабжённые антикеш-заголовком. Другие браузеры этого не делают. Чтобы этого избежать, сервер должен добавить в ответ соответствующие антикеш-заголовки, например Cache-Control: no-cache .


Впрочем, использовать заголовки типа Expires , Last-Modified и Cache-Control рекомендуется в любом случае, чтобы дать понять браузеру (не обязательно IE), что ему следует делать.

Альтернативный вариант – добавить в URL запроса случайный параметр, предотвращающий кеширование.

Например, вместо xhr.open(‘GET’, ‘service’, false) написать:

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

Итого

Типовой код для GET-запроса при помощи XMLHttpRequest :

Мы разобрали следующие методы XMLHttpRequest :

  • open(method, url, async, user, password)
  • send(body)
  • abort()
  • setRequestHeader(name, value)
  • getResponseHeader(name)
  • getAllResponseHeaders()
  • timeout
  • responseText
  • responseXML
  • status
  • statusText
  • onreadystatechange
  • ontimeout
  • onerror
  • onload
  • onprogress
  • onabort
  • onloadstart
  • onloadend

Задачи

Выведите телефоны

Создайте код, который загрузит файл phones.json из текущей директории и выведет все названия телефонов из него в виде списка.

Исходный код просто выводит содержимое файла (скачайте к себе):

Быстро и легко. Разбор (парсинг) XML документов с помощью TXMLDocument

TXMLDocument – стандартный компонент для работы с XML, который входит в состав как VCL, так и FireMonkey. Данный компонент позволяет разбирать уже готовые XML файлы и формировать новые. При этом он выполняет обе задачи достаточно просто и эффективно.

Постановка задачи

Рассмотрим разбор XML на примере документа следующей структуры:

В документе имеется корневой элемент test, два обычных узла node1 (имеет атрибут attr) и node2, а также узел array, представляющий собой, по сути, массив некоторых данных.

Допустим, узел node1 и его атрибут необходимо интерпретировать как текст, node2, как числовое значение, а содержимое узла array, как набор строковых данных.

Реализация

Вначале необходимо загрузить XML документ из файла.

Далее получаем корневой элемент:

После этого можно приступать непосредственно к самому процессу разбора (парсинга).

Для доступа к дочерним узлам используется свойство ChildNodes, которое возвращает массив элементов IXMLNodeList. Для получения конкретного узла (элемента IXMLNode) нужно обратиться к нему по имени или номеру (нумерация начинается с нуля).

Содержимое узла доступно с помощью свойства Text в виде строки.

Доступ к атрибутам конкретного узла осуществляется аналогичным образом при помощи свойства Attributes, которое возвращает массив типа OleVariant содержащий непосредственно сами значения атрибутов.

Извлечём значение первого узла и его атрибута.

Значение второго узла извлекается аналогично, но с учётом того, что его требуется интерпретировать как число.

Для обхода массива потребуется цикл с обращением к каждому элементу по его номеру.

В результате всех вышеописанных действий данные из XML документа будут загружены и отображены в программе.

Несмотря на простоту, подобным образом можно выполнить разбор (парсинг) XML документов практически любой структуры и, соответственно, сложности.

Особенности работы с TXMLDocument в FireMonkey

В отличие от VCL, FireMonkey кроссплатформенная библиотека. Поэтому при работе с TXMLDocument в проектах FireMonkey требуется указывать программу, которая будет заниматься непосредственным разбором XML разметки в свойстве DOMVendor.

Илон Маск рекомендует:  Типы данных и их объявление

Доступны три варианта. MSXML для Windows (используется в этой операционной системе по умолчанию) и два кроссплатформенных Omni XML ADOM XML v4.

Если приложение предназначено для использования не только в Windows или вообще не предназначено для этой операционной системы, нужно обязательно учитывать данное обстоятельство и правильно выбирать программу для разбора XML разметки.

Генерация XML запроса к серверу и парсинг ответа

Подскажите пожалуйста как правильно делать запрос в xml формате и куда при этом будет приходить ответ, на тот же файл ?

И чтобы это все было без перезагрузке нужно использовать ajax ?

Мне нужно подключится к api
Запрос отправляется к http://orders.novaposhta.ua/xml.php

Чем отправлять запрос ?
Я так понял что получить ответ можно через simplexml_load_file(«file.xml»);

Но поидее ответ автоматом его отдает при подаче запроса. Можете расказать хотябы логику работы либо пример над чем либо, а то совсем запутался

или правильней будет использовать curl_init() ??

А у api есть документация?

10.09.2013, 16:12 #2
Сказали спасибо:
10.09.2013, 19:47 #3
10.09.2013, 20:08 #4
bashkir102
Посмотреть профиль
Найти ещё сообщения от bashkir102

xml отправил xml получил.

как GET запросом получить xml документ серверу?
kvins, документацию читать надо по api

Видимо, вы никогда не работали с VK API. Правило хорошего тона — GET отправил, получил xml/json и т.д.

ТC, 659059605 icq, отпиши, подскажу по возможности.

10.09.2013, 20:18 #5
10.09.2013, 20:37 #6
bashkir102
Посмотреть профиль
Найти ещё сообщения от bashkir102

Постом XML запрос отправляйте на необходимый адрес, далее сервер должен вернуть сразу ответ. Пример:

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, «http://orders.novaposhta.ua/xml.php»);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$body = curl_exec($ch);
curl_close($ch);

12.09.2013, 06:53 #7
Сказали спасибо:
Vladimir-AWM
Посмотреть профиль
Посетить домашнюю страницу Vladimir-AWM
Найти ещё сообщения от Vladimir-AWM

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

Возможно нужно было новую тему создать, но она касается этого же xml и этот api

Получаю я ответ с сервера в виде масива который я вывожу так
print_r($warenhouse); чтобы посмотреть что в нем,
но почему то у меня не открывается масив такого вида
print_r($warenhouse [‘warenhouse’]);
Где находится основная информация , что я делаю не так
Скрин прилагаю

В скрине вывод масива из
print_r($warenhouse);

может вся проблема в SimpleXMLElement Object которая все время пресудствует перед масивом

12.09.2013, 19:07 #8

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

Возможно нужно было новую тему создать, но она касается этого же xml и этот api

Получаю я ответ с сервера в виде масива который я вывожу так
print_r($warenhouse); чтобы посмотреть что в нем,
но почему то у меня не открывается масив такого вида
print_r($warenhouse [‘warenhouse’]);
Где находится основная информация , что я делаю не так
Скрин прилагаю

В скрине вывод масива из
print_r($warenhouse);

может вся проблема в SimpleXMLElement Object которая все время пресудствует перед масивом

Часть 8. Использование XML в запросах и ответах

О сложностях взаимодействия клиент/сервер в Ajax

Серия контента:

Этот контент является частью # из серии # статей: Освоение Ajax

Этот контент является частью серии: Освоение Ajax

Следите за выходом новых статей этой серии.

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

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


Сервер не может много сказать (иногда)

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

Клиент говорит парами «имя/значение»

Как вы помните из предыдущей статьи, клиенту не нужно использовать XML в большинстве случаев, потому что он может посылать запросы, используя пары «имя/значение». То есть вы могли бы послать, например, такое имя: name=Jennifer. Можно скомпоновать эти значения, просто добавляя между парами амперсанд (&), например: name=Jennifer&job=president. Используя простой текст и эти пары – «имя/значение», клиент легко может посылать серверу запросы с многочисленными значениями. Очень редко появляется необходимость дополнительного структурирования, которое предоставляет XML.

Фактически, почти все причины, по которым может понадобиться посылать XML серверу, можно распределить на две основные категории:

  • Сервер принимает только XML-запросы. В этих случаях у вас просто нет выбора. Знания из предыдущих статей дают все инструменты, которые необходимы для отправки таких видов запросов.
  • Вы вызываете удаленный API, который принимает только XML или SOAP-запросы. На самом деле, это частный случай предыдущего пункта, но о нем стоит упомянуть отдельно. Если вы хотите использовать API из Google или Amazon в асинхронном запросе, есть несколько различных решений. Мы обсудим их, как и несколько примеров создания запросов для такого типа API, в следующей статье.

Серверы не могут отправлять пары «имя/значение» (стандартным образом)

Когда вы отсылаете пары «имя/значение», Web-браузер, посылающий запросы и отвечающая на этот запрос платформа, на которой размещается программа-сервер, объединяются, чтобы превратить эти пары в данные, с которыми программа-сервер может работать. Практически каждая технология серверной части – от сервлетов Java до PHP или Perl, или Ruby on Rails – предоставляет широкий спектр средств для получения значений на основе имени. Поэтому получение аттрибута name – задача тривиальная.

Но ситуация меняется, когда направление передачи данных меняется на обратное. Если сервер отвечает приложению строкой name=Jennifer&job=president, у клиента нет стандартизированного, простого способа разбить ее на пары «имя/значение» и затем разбить каждую пару на имя и значение. Вам придется разбивать возвращенные данные вручную. Если сервер вернет ответ, сразу составленный из пар «имя/значение», то будет ненамного проще (а может быть даже сложнее) его интерпретировать, чем любой ответ с элементами, разделенными точкой с запятой, или символами конвейеризации «|», или же любыми другими нестандартными знаками форматирования.

Дайте мне несколько пробелов!

В большинстве HTTP-запросов управляющая последовательность символов %20 используется для представления одного пробела. Поэтому строка «Live Together, Die Alone» будет пересылаться по HTTP как Live%20Together,%20Die%20Alone.

Тогда получается, что нет простого способа использовать обычный текст в ответах и заставлять клиента получать этот ответ и интерпретировать его стандартным образом, по крайней мере, когда он содержит сложные значения. Если ваш сервер просто отсылает обратно, скажем, число 42, то простой текст идеально подходит. Но что делать, если нужно отослать обратно последние рейтинги для телешоу Lost, Alias и Six Degree, причем все сразу? И хотя вы можете найти множество способов отправить ответ, используя обычный текст (см. несколько примеров в листинге 1), ни один из них не будет интерпретироваться без определенной работы на клиентской части, и ни один из них не стандартизирован.

Листинг 1. Ответ сервера для телерейтингов (различные версии)

И хотя не слишком сложно понять, как разбить эти строки ответа, клиент должен проанализировать и разделить строку, основываясь на точках с запятой, знаках равенства, вертикальных чертах и амперсандах. Едва ли это хороший способ написать ясный код, который другие разработчики смогут легко понять и поддерживать.

Ввод XML

Когда вы поймете, что у сервера нет стандартного способа для ответа клиенту парами «имя/значение», необходимость использования XML станет достаточно очевидной. Когда посылаются данные на сервер, пары «имя/значение» – великолепный выбор, так как сервер может легко интерпретировать эти пары; то же самое верно и для возврата данных с использованием XML. Вы видели применение DOM для распознавания структуры XML в нескольких предыдущих статьях, а в следующей статье узнаете, как JSON предоставляет для этого еще один способ. И, что самое главное, вы можете рассматривать XML как простой текст и получать значения таким образом. Поэтому есть несколько путей получения XML-ответа от сервера, и с помощью достаточно стандартного кода вытащить данные и использовать их в клиенте.

Дополнительным бонусом можно считать простоту понимания XML. Большинство людей, умеющих программировать, легко поймут смысл данных в листинге 2.

Листинг 2. Ответ сервера для телерейтингов (в XML)

В коде листинга 2 не нужно ломать голову насчет того, что означает определенная точка с запятой или апостроф.

Получение XML от сервера

Так как эта серия статей фокусируется на клиентской стороне работы Ajax, то я не буду вдаваться в детали того, как может генерировать ответ в виде XML серверная часть. Однако вам нужно знать о некоторых особенностях того, как клиент получает XML.

Во-первых, вы можете рассмотреть XML-ответ от сервера двумя основными способами:

  • Как простой текст, который просто оказался отформатированным как XML
  • Как XML-документ, представленный объектом DOM Document

Во-вторых, возьмем простой ответ XML от сервера для примера. В листинге 3 показаны те же данные, что были приведены выше (фактически, это тот же XML, как в листинге 2, повторенный для вашего удобства). В этом разделе я буду использовать данный пример XML.

Листинг 3. Примеры телерейтингов, отформатированные в XML

Работа с XML как с обычным текстом

Простейший вариант работы с XML, по крайней мере в плане изучения новых техник программирования, это обращение с ним как с любым другим текстом, возвращенным с сервера. Другими словами, вы игнорируете формат данных и просто забираете ответ с сервера.

В этой ситуации вы используете свойство responseTest вашего объекта запроса, точно также как и в случае, когда сервер посылает вам не XML-форматированный ответ (см. листинг 4).

Листинг 4. Считаем XML обычным текстовым ответом с сервера

Просмотрите предыдущие статьи

Чтобы избежать большого количества повторяющегося кода, в последних статьях серии показываются только небольшие фрагменты кода, имеющие отношение к обсуждаемому предмету. Таким образом в листинге 4 показан только метод обратной связи в коде клиентской части Ajax-приложения. Если вам непонятно, каким образом встроить этот метод в контекст асинхронного приложения, обратитесь к нескольким первым статьям серии, в которых описываются основы Ajax-приложений. Смотрите ссылки на ранние статьи в разделе Ресурсы.

В этом фрагменте кода updatePage() – это обратный вызов, а request – это объект XMLHttpRequest . И в итоге вы помещаете ответ сервера в переменную response . Если бы вы вывели на экран значение этой переменной, то получили бы нечто похожее на листинг 5. (Замечу, что обычно код, представленный в листинге 5 – это одна длинная строчка; здесь он разбит на несколько строк для удобства.)

Листинг 5. Значение переменной response

Очень важно отметить здесь, что в большинстве случаев серверы возвращают XML без пробелов и переходов на новую строку; они просто связывают все вместе, как в листинге 5. Конечно, для вашего приложения пробелы не имеют значения, поэтому это не является проблемой, просто немного усложняет чтение XML.

Здесь вы можете использовать функцию JavaScript split для того, чтобы разбить эти данные, и основные средства управления строкой, чтобы получить имена элементов и их значения. Конечно, это дополнительные усилия, и игнорирование того факта, что вы потратили много времени, изучая DOM ранее в этой серии статей. Поэтому я призываю вас запомнить, что вы можете использовать XML-ответ сервера при помощи responseText , но вам не стоит использовать этот подход для получения XML-данных, если можно использовать DOM, что вы и увидите далее.

Чтобы увидеть это в действии, посмотрите на листинг 6. Этот код похож на листинг 4, но, вместо того, чтобы использовать свойство responseText , обратная связь использует свойство responseXML . Это свойство, доступное в XMLHttpRequest , возвращает ответ сервера в форме DOM-документа.

Рассматриваем XML как XML

Хотя вы можете рассматривать ответ сервера в XML-формате, как и любой другой текстовый ответ, вовсе необязательно делать именно так. Во-первых, если вы честно прочли предыдущие статьи, вы знаете, как использовать DOM, JavaScript- дружественный API, с которыми вы можете управлять XML. Что еще лучше, JavaScript и объект XMLHttpRequest предоставляют свойство, которое превосходно подходит для получения XML-ответа от сервера, и его получения в форме объекта Document DOM.

Листинг 6. Рассмотрение XML как XML

Теперь у вас есть DOM Document, и вы можете работать с ним, как и с любым другим XML. Например, вы можете взять все элементы show , как в листинге 7.

Листинг 7. Выбор всех элементов show

Если вы уже знакомы с DOM, то вам и это будет знакомым. Вы можете использовать любые методы DOM, о которых вы уже узнали, и легко управлять XML, полученным от сервера.

Вы можете также, конечно, вставить нормальный код JavaScript. Например, вы можете написать цикл повторения по всем элементам show , как в листинге 8.

Листинг 8. Цикл по show-элементам

С помощью этого достаточно простого кода, мы рассмотрели XML как XML, а не просто неотформатированный текст, и немного использовали DOM и JavaScript для обработки ответа сервера. Еще более важно то, что мы работали со стандартизированным форматом – XML – вместо формата с разделяющими запятыми или парами «имя/значение» разделенными вертикальными чертами. Другими словами, мы использовали XML там, где это имело смысл, и избежали этого в других случаях, как, например, в отправке запроса на сервер.

XML на сервере: короткий пример

Хотя я практически не говорил о том, как генерировать XML на сервере, стоит рассмотреть короткий пример без подробных комментариев, просто чтобы вы могли придумать какие-то свои собственные способы того, что делать в такой ситуации. В листинге 9 показан простой PHP-сценарий, который выдает XML в ответ на запрос, предположительно от асинхронного клиента.

Это грубый подход, где сценарий PHP печатает XML-вывод вручную. Вы можете найти огромное разнообразие инструментов и API для PHP и большинства других языков серверной части, которые также позволяют вам генерировать XML-ответы. В любом случае этот пример дает вам представление о том, как выглядят сценарии серверной части, которые отвечают на запросы и генерируют ответ в виде XML.

Листинг 9. Сценарий PHP, который возвращает XML

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

Другие варианты интерпретации XML

Кроме вариантов работы с XML в виде неформатированного текста или с помощью DOM, есть еще один очень популярный способ, о котором важно упомянуть. Это JSON (JavaScript Object Notation) – свободный текстовый формат, который входит в комплект с JavaScript. В этой статье не хватит места, чтобы рассказать о JSON, поэтому я вернусь к нему через несколько месяцев; возможно, вы услышите о нем, как только упомянете об XML или Ajax, так что теперь вы будете знать, о чем говорят ваши коллеги.

В общем, все, что вы можете делать с JSON, вы можете делать с DOM и наоборот; выбор подхода зависит от личных предпочтений и конкретного приложения. Теперь давайте остановимся на DOM и ознакомимся с ситуацией получения ответа сервера. Я посвящу пару статей обсуждению JSON, и тогда вы сможете сделать выбор между ним и DOM при использовании в своем приложении. Так что настройтесь: еще больше информации об XML ждет вас в следующих статьях.

Заключение

Я говорил об XML почти безостановочно, но все еще осветил только минимум вклада XML в работу с Ajax. В следующей статье я более подробно рассмотрю особые случаи, в которых вы должны отправлять XML (и вы узнаете, в каком из этих случаев надо также получать XML обратно). В частности, вы изучите Web-сервисы – как собственные, так и такие API, как Google – в свете работы с Ajax.

Ваше задание на ближайшее время – обдумать, в каких случаях есть смысл использовать XML в своем приложении. Часто, если ваше приложение хорошо работает, то XML не представляет из себя ничего, кроме модной технологии, которая добавит вам головной боли, и вы должны устоять перед соблазном использовать ее только затем, чтобы сказать «а я в своем приложении использую XML».

Если вы столкнулись с ситуацией, когда данные, которые вам отправляет сервер, ограничены, или они имеют странный формат с запятыми или вертикальными чертами в качестве разграничителей, то XML действительно может вам помочь. Пересмотрите работу сервера или измените его компоненты так, чтобы они возвращали ответы более стандартным образом – с помощью XML.

Более того, поймите, что чем больше вы узнаете о технологиях связанных с Ajax, тем более осторожным нужно быть в своих решениях. Конечно, интересно писать Web 2.0-приложения (и в следующих статьях я вернусь к пользовательскому интерфейсу и покажу вам еще более интересные вещи), но необходимо быть уверенным, что вы не добавляете модные технологии на работающую Web-страницу, просто чтобы впечатлить своих друзей. Я знаю, что вы можете написать хорошее приложение, так что не сидите и просто сделайте это. Когда вы закончите, возвращайтесь за следующей статьей и еще большим количеством информации по XML.

Ресурсы для скачивания

Похожие темы

  • Раздел developerWorks XML: в разделе XML сайта developerWorks вы найдете расширенный обзор технических статей и подсказок, инструкций, стандартов и IBM Redbooks.
  • Раздел developerWorks Open source: откройте для себя ресурсы для разработки и реализации открытого кода.
  • xml.com: начните с самого простого online-ресурса о XML, если вы еще не являетесь опытным XML-программистом.
  • «Использование модулей Python xml2sql и dtd2sql (Using Python modules xml2sql and dtd2sql)» (EN): формируйте SQL-утверждения, чтобы создавать и заполнять базу данных из пары популярных модулей из Python, касающихся XML.
  • «Создание динамических Java-приложений (Build dynamic Java applications)»: взгляните на Ajax через призму Java с точки зрения написания серверных приложений.
  • «Сериализация Java-объектов для Ajax (Java object serialization for Ajax)»: посмотрите, как посылать объекты по сети и взаимодействовать с Ajax через призму Java.
  • «Вызов Web-сервисов SOAP с помощью Ajax (Call SOAP Web services with Ajax)» (EN): вникните в содержание достаточно продвинутой статьи посвященной интеграции Ajax с существующими Web-сервисами, основанными на SOAP; она показывает, как реализовывать Web-сервисы для браузера клиента с помощью шаблонов Ajax.
  • Страница DOM на World W >

Комментарии

Войдите или зарегистрируйтесь для того чтобы оставлять комментарии или подписаться на них.

XML Запрос и ответ php

Опции темы

Подскажите пожалуйста как правильно делать запрос в xml формате и куда при этом будет приходить ответ, на тот же файл ?

Мне нужно подключится к api
Запрос отправляется к http://orders.novaposhta.ua/xml.php

Пример

Чем отправлять запрос, нужно использовать curl_init() ??
Я так понял что получить ответ можно через simplexml_load_file(«»); , а вот как сначала дать запрос я запутался

Но поидее ответ автоматом его отдает при подаче запроса. Можете расказать хотябы логику работы либо пример над чем либо, а то совсем запутался

2 И чтобы все это было без перезагрузки нужен аякс или просто запрос делать при загрузке страницы ?

http запрос. передача xml методом POST.

Пытаюсь отправить запрос.
Вот код:


Запрос доходит до адресата. В теле запроса передаётся xml. Но есть проблема.

(1) TODD22,
Я отправляю на обработку xml-ку вот таким образом. Через HTTPЗапрос.
xml большого размера без проблем передаются.

Ниже рабочий код отправки пост’а.

(2) dj_serega, А можно весь код? С инициализацией HTTPСоединения и формированием тела запроса.

А то у меня запрос то доходит. Где то в формирование тела проблема.

На принимающей стороне отладчиком смотрят кусок от xml до них доходит. Но дальше парсер считывает содержимое из поле xml до:

  • Скопировать ссылку
  • Перейти

Объект XMLHttpRequest

Объект XMLHttpRequest (или, сокращенно, XHR) дает возможность браузеру делать HTTP-запросы к серверу без перезагрузки страницы.

Несмотря на слово XML в названии, XMLHttpRequest может работать с данными в любом текстовом формате, и даже бинарными данными. Использовать его очень просто.

Кроссбраузерное создание объекта запроса

В зависимости от браузера, код для создания объекта может быть разный. Кроссбраузерная функция создания XMLHttpRequest:

Функция тупо перебирает возможные внутренние реализации и возвращает начальный объект XMLHttpRequest. Существует и масса других рабочих кроссбраузерных функций, однако все они по сути делают то же самое.

Использование XMLHTTPRequest

Различают два использования XmlHttpRequest. Первое — самое простое, синхронное.

Синхронный XMLHttpRequest

Здесь сначала создается запрос, задается открытие (open) синхронного соединение с адресом /xhr/test.html и запрос отсылается с null, т.е без данных: send(null).

При синхронном запросе браузер «подвисает» и ждет на строчке 3, пока сервер не ответит на запрос. Когда ответ получен — выполняется строка 4, код ответа сравнивается с 200 (ОК), и при помощи alert печатается текст ответа сервера. Все максимально просто.

Свойство responseText получит такой же текст страницы, как браузер, если бы Вы в перешли на /xhr/test.html. Для сервера GET-запрос через XmlHttpRequest ничем не отличается от обычного перехода на страницу.

Асинхронный XMLHttpRequest

Асинхронность включается третьим параметром функции open. В отличие от синхронного запроса, функция send() не останавливает выполнение скрипта, а просто отправляет запрос.

Запрос req регулярно отчитывается о своем состоянии через вызов функции req.onreadystatechange. Состояние под номером 4 означает конец выполнения, поэтому функция-обработчик при каждом вызове проверяет — не настало ли это состояние.

Вообще, список состояний readyState такой:

Состояния 0-2 вообще не используются.

Вызов функции с состоянием Interactive в теории должен происходить каждый раз при получении очередной порции данных от сервера. Это могло бы быть удобным для обработки ответа по частям, но Internet Explorer не дает доступа к уже полученной части ответа.
Firefox дает такой доступ, но для обработки запроса по частям состояние Interactive все равно неудобно из-за сложностей обнаружения ошибок соединения. Поэтому Interactive тоже не используется.

На практике используется только последнее, Complete.

Если хотите углубиться в тонкости багов браузеров c readyState, отличными от 4, то многие из них рассмотрены в статье на Quirksmode (англ.).

Не используйте синхронные запросы

Синхронные запросы применяются только в крайнем случае, когда кровь из носу необходимо дождаться ответа сервера до продолжения скрипта. В 999 случаях из 1000 можно использовать асинхронные запросы. При этом общий алгоритм такой:

  1. Делаем асинхронный запрос
  2. Рисуем анимированную картинку или просто запись типа «Loading. «
  3. В onreadystatechange при достижении состояния 4 убираем Loading и, в зависимости от status вызываем обработку ответа или ошибки.

Кроме того, иногда полезно ставить ограничение на время запроса. Например, хочется генерировать ошибку, если запрос висит более 10 секунд.

Для этого сразу после send() через setTimeout ставится вызов обработчика ошибки, который очищается при получении ответа и обрывает запрос с генерацией ошибки, если истекли 10 секунд.

Таймаут на синхронный запрос ставить нельзя, браузер может висеть долго-долго.. А вот на асинхронный — пожалуйста.

Этот пример демонстрирует такой таймаут.

Методы объекта XMLHttpRequest

Первый параметр method — HTTP-метод. Как правило, используется GET либо POST, хотя доступны и более экзотические, вроде TRACE/DELETE/PUT и т.п.

URL — адрес запроса. Можно использовать не только HTTP/HTTPS, но и другие протоколы, например FTP и FILE://. При этом есть ограничения безопасности, так называемая «same origin policy»: запрос со страницы можно отправлять только на тот домен и порт, с которого она пришла.

Ниже это ограничение и способы обхода будут рассмотрены подробнее.

async = true задает асинхронные запросы, эта тема была поднята выше.

userName, password — данные для HTTP-авторизации.

Отсылает запрос. Аргумент — тело запроса. Например, GET-запроса тела нет, поэтому используется send(null) , а для POST-запросов тело содержит параметры запроса.

abort()

Вызов этого метода req.abort() обрывает текущий запрос.

Здесь есть одно НО для браузера Internet Explorer. Успешный вызов abort() на самом деле может не обрывать соединение, а оставлять его в подвешенном состоянии на некоторый таймаут (20-30 секунд). Отловить такие повисшие соединения можно через прокси для отладки, например, Fiddler.

У браузера есть лимит: не более 2 одновременных соединений с одним доменом-портом. Т.е, если два соединения уже висят (и отвиснут по таймауту), то третье открыто не будет, пока одно из них не умрет. Надеюсь, Вы с такой проблемой не столкнетесь. Ее можно обойти использованием кросс-доменных XmlHttpRequest.

setRequestHeader(name, value)

getAllResponseHeaders()

getResponseHeader(headerName)

Свойства объекта XMLHttpRequest

onreadystatechange

readyState

responseText

responseXML

Ответ сервера в виде XML, при readyState=4.

Это свойство хранит объект типа XML document, с которым можно обращаться так же, как с обычным document. Например,

Чтобы браузер распарсил ответ сервера в свойство responseXML, в ответе должен быть заголовок Content-Type: text/xml.
Иначе свойство responseXML будет равно null.

status

Для HTTP-запросов — статусный код ответа сервера: 200 — OK, 404 — Not Found, и т.п. Браузер Internet Explorer может также присвоить status код ошибки WinInet, например 12029 для ошибки «cannot connect».

Запросы по протоколам FTP, FILE:// не возвращают статуса, поэтому нормальным для них является status=0.

statusText

Текстовая расшифровка status, например «Not Found» или «OK».

GET и POST-запросы. Кодировка.

При отправке обычной формы, браузер сам кодирует значения полей и составляет тело GET/POST-запроса. При работе через XmlHttpRequest, это нужно делать самим, в коде. Большинство проблем и вопросов здесь связано с непониманием, где и какое кодирование нужно осуществлять.

Есть два вида кодирования запроса. Первый — это метод GET и POST-формы с кодировкой urlencoded, она же — кодировка по умолчанию. В браузере они определяются как:

При таком способе кодировки (urlencoded) название и значение каждой переменной кодируется функцией encodeURIComponent. Формируя XmlHttpRequest, мы должны делать то же самое «руками». Конечно, только с теми переменными, в которых могут быть спецсимволы или не английские буквы, т.е которые и будут как раз закодированы.

В методе POST параметры передаются не в URL, а в теле, посылаемом через send() . Поэтому params нужно указывать не в адресе, а при вызове send()

Кроме того, при POST обязателен заголовок Content-Type, содержащий кодировку. Это указание для сервера — как обрабатывать (раскодировать) пришедший запрос.

Заголовки Content-Length, Connection в POST-запросах, хотя их и содержат некоторые «руководства», обычно не нужны. Используйте их, только если Вы действительно знаете, что делаете.

Запросы multipart/form-data

Второй способ кодирования — это отсутствие кодирования. Например, это нужно для пересылки файлов. Он указывается в форме (только для POST) так:

В этом случае ничего не кодируется. А сервер, со своей стороны, посмотрев на Content-Type(=multipart/form-data), поймет, что пришло.

Возможности XmlHttpRequest позволяют создать запрос с любым телом. Например, можно вручную сделать POST-запрос, загружающий на сервер файл. Функционал создания таких запросов есть, например, во фреймворке dojo. Но можно сделать и самому, если почитать о нужном формате тела POST и заголовках.

Кодировка

Если Вы используете только UTF-8 — пропустите эту секцию.

Все идущие на сервер параметры GET/POST, кроме случая multipart/form-data, кодируются в UTF-8. Не в кодировке страницы, а именно в UTF-8. Поэтому, например, в PHP их нужно при необходимости перекодировать функцией iconv.

С другой стороны, когда ответ с сервера браузер воспринимает в той кодировке, которая указана в заголовке ответа Content-Type. Т.е, опять же, в PHP, чтобы браузер воспринял ответ в windows-1251 и нормально отобразил данные на странице в windows-1251, нужно послать заголовок в php-коде самим, типа:

Или же, это должен сделать сервер. Например, в apache автоматически добавляется кодировка опцией:

Частые проблемы

Кеширование

Многие браузеры поддерживают кеширование ответов на XmlHttpRequest запросы. При этом реализации кеширования немного разные.

Например, при повторном XmlHttpRequest на тот же URL, Firefox посылает запрос с заголовком «If-Modified-Since» со значением, указанным в заголовке «Last-Modified» предыдущего ответа.

А Internet Explorer делает так, только когда кешированный ответ устарел, т.е после времени из заголовка «Expires» предыдущего ответа. Поэтому, кстати, многие думают, что Internet Explorer вообще не очищает кеш ответов.

Самое простое решение проблемы — просто убрать кеширование. Например, при помощи заголовков, или добавлением случайного параметра в URL типа:


Есть, однако, ряд случаев, когда кеширование XMLHttpRequest браузером полезно, улучшает время ответа и экономит трафик.

Пример демонстрирует универсальный код работы с кешем для Internet Explorer и Firefox.

В Internet Explorer, если запрос возвращается из кеша без перепроверки, заголовок Date — пустая строка. Поэтому нужно сделать дополнительный запрос, который на самом деле никакой не дополнительный, т.к текущий возвращен из кеша.

Ссылку на кешированый запрос сохраняем, т.к если код ответа дополнительного запроса — «304 Not Modified», то его тело станет пустой строкой («»), и нужно будет вернуться к кешированному объекту. Более эффективным, впрочем, будет не создавать новый объект XmlHttpRequest, а сохранить данные из существующего и использовать заново его же.

Пример выше опирается на то, что сервер всегда выдает заголовок «Date», что верно для большинства конфигураций. В нем делается синхронный запрос. В асинхронном случае, проверка на Date и т.д нужно делать после получения ответа в функции-обработчике onreadystate.

Повторное использование объекта XmlHttpRequest

В Internet Explorer, если open() вызван после установки onreadystatechange, может быть проблема с повторным использованием этого XmlHttpRequest.

Чтобы использовать заново XmlHttpRequest, сначала вызывайте метод open(), а затем — присваивайте onreadystatechange. Это нужно потому, что IE неявно очищает объект XmlHttpRequest в методе open(), если его статус «completed».

Вызывать abort() для перенаправления запроса на другой URL не нужно, даже если текущий запрос еще не завершился.

Утечки памяти

В Internet Explorer объект XmlHttpRequest принадлежит миру DOM/COM, а Javascript-функция — миру Javascript. Вызов req.onreadystatechange = function() < . >неявную круговую связь: req ссылается на функцию через onreadystatechange, а функция, через область видимости — видит (ссылается на) req.

Невозможность обнаружить и оборвать такую связь во многих (до IE 6,7 редакции июня 2007?) версиях Internet Explorer приводит к тому, что XmlHttpRequest вместе с ответом сервера, функция-обработчик, и всё замыкание прочно оседают в памяти до перезагрузки браузера.

Чтобы этого избежать, ряд фреймворков (YUI, dojo. ) вообще не ставят onreadystatechange, а вместо этого через setTimeout проверяют его readyState каждые 10 миллисекунд. Это разрывает круговую связку req onreadystatechange, и утечка памяти не грозит даже в самых глючных браузерах.

Ограничения безопасности. Кросс-доменный XMLHttpRequest

Для ограничения XmlHttpRequest используется философия «Same Origin Policy». Она очень проста — каждый сайт в своей песочнице. Запрос можно делать только на адреса с тем же протоколом, доменом, портом, что и текущая страница.

Т.е, со страницы на адресе http://site.com нельзя сделать XmlHttpRequest на адрес https://site.com, http://site.com:81 или http://othersite.com

Это создает проблему, если хочется взять контент с другого сайта. Как правило, в этом случае вместо XmlHttpRequest используются другие средства, например, загрузка через динамически создаваемый тег

Быстро и легко. Разбор (парсинг) XML документов с помощью TXMLDocument

TXMLDocument – стандартный компонент для работы с XML, который входит в состав как VCL, так и FireMonkey. Данный компонент позволяет разбирать уже готовые XML файлы и формировать новые. При этом он выполняет обе задачи достаточно просто и эффективно.

Постановка задачи

Рассмотрим разбор XML на примере документа следующей структуры:

В документе имеется корневой элемент test, два обычных узла node1 (имеет атрибут attr) и node2, а также узел array, представляющий собой, по сути, массив некоторых данных.

Допустим, узел node1 и его атрибут необходимо интерпретировать как текст, node2, как числовое значение, а содержимое узла array, как набор строковых данных.

Реализация

Вначале необходимо загрузить XML документ из файла.

Далее получаем корневой элемент:

После этого можно приступать непосредственно к самому процессу разбора (парсинга).

Для доступа к дочерним узлам используется свойство ChildNodes, которое возвращает массив элементов IXMLNodeList. Для получения конкретного узла (элемента IXMLNode) нужно обратиться к нему по имени или номеру (нумерация начинается с нуля).

Содержимое узла доступно с помощью свойства Text в виде строки.

Доступ к атрибутам конкретного узла осуществляется аналогичным образом при помощи свойства Attributes, которое возвращает массив типа OleVariant содержащий непосредственно сами значения атрибутов.

Извлечём значение первого узла и его атрибута.

Значение второго узла извлекается аналогично, но с учётом того, что его требуется интерпретировать как число.

Для обхода массива потребуется цикл с обращением к каждому элементу по его номеру.

В результате всех вышеописанных действий данные из XML документа будут загружены и отображены в программе.

Несмотря на простоту, подобным образом можно выполнить разбор (парсинг) XML документов практически любой структуры и, соответственно, сложности.

Особенности работы с TXMLDocument в FireMonkey

В отличие от VCL, FireMonkey кроссплатформенная библиотека. Поэтому при работе с TXMLDocument в проектах FireMonkey требуется указывать программу, которая будет заниматься непосредственным разбором XML разметки в свойстве DOMVendor.

Доступны три варианта. MSXML для Windows (используется в этой операционной системе по умолчанию) и два кроссплатформенных Omni XML ADOM XML v4.

Если приложение предназначено для использования не только в Windows или вообще не предназначено для этой операционной системы, нужно обязательно учитывать данное обстоятельство и правильно выбирать программу для разбора XML разметки.

Парсинг от А до Я

Блог о программировании парсеров и web-автоматизации

Поиск по блогу

среда, 22 апреля 2009 г.

HTTP protocol, HTTP requests

Пусть вас не смущает заголовок на буржуйском. Просто блоггер.ком — хитрая штука, тут очень своеобразно и не очень гибко генерируются названия документов.
___

Раз уж я собралась писать статьи «от А», то сегодня поговорим на тему, с которой необходимо ознакомиться, прежде чем писать более-менее серьезные программы для работы с интернетом. Эта тема — протокол HTTP .

Часто возникают задачи, связанные с отправкой запроса на сервер и, соответственно, получением ответа от него. Например, отправка данных через форму. Можно, конечно, для этих целей использовать TWebBrowser (автоматизировать заполнение и отправку формы — элементарно, и механизм кукисов этим компонентом поддерживается), но это неэкономично и ресурсоемко. Именно поэтому я начала писать про Indy, а потом еще и про сокеты напишу. :) Но для работы с Indy надо иметь представление о формате обмена данными между клиентом и сервером. К этому и переходим.

Браузер и веб-сервер обмениваются данными по протоколу HTTP. Запрос по этому протоколу в общем виде состоит из указания метода запроса, заголовков (Header) и тела запроса.

Основные разновидности HTTP-запросов: GET, HEAD и POST.

GET-запрос
GET — означает «получить». С помощью GET-запроса мы можем получить содержимое какого-либо документа.
Когда наш браузер хочет получить содержимое странички, например, http://www.blogok.ru/2009/03/17/kak-zapretit-redaktirovanie-vyborochnyx-strok-v-cxgrid/, то он отправляет GET запрос, в котором указывает, что он хочет получить, откуда пользователь узнал об этой страничке (HTTP-REFERER) и кто посылает запрос (USER-AGENT).

Пример GET-запроса «из жизни»:

Как видите, методом запроса является GET, протокол — HTTP 1.1. Все, что ниже, — заголовок. Помимо адреса страницы, содержимое которой браузер пытается получить, он передает в заголовке еще кучу всяких параметров. И далеко не все нам потом пригодятся. Имена и параметры заголовков разделены двоеточнием. А сам заголовок отделен от тела запроса двумя переводами строк.

Как видно из данного примера, браузер разбирает URL на «составляющие», а именно путь к файлу (Path=’/2009/03/17/kak-zapretit-redaktirovanie-vyborochnyx-strok-v-cxgr браузера.

Если перевести заголовок запроса на условно-русский, то получается примерно:
«Я, User-Agent, пришел по рекомендации сервера Referer и хочу получить файл Path с сервера Host».

В поле Cookie браузер посылает свои кукисы.

HEAD-запрос
HEAD-запрос можно сравнить с «пингованием», т.е. посылкой пакета. И если сервер ответит, то он доступен. :) В принципе, для проверки доступности сервера он чаще всего и используется.

Тут все аналогично GET-запросу. Разница состоит в том, что на GET-запрос браузер получает ответ от сервера и содержимое документа, а на HEAD-запрос — только ответ сервера.

Ответ сервера снабжен кодом-идентификатором. Расшифровку этих кодов можно посмотреть в любой справочной документации.

POST-запрос
Возможности POST-запроса несколько шире. Это запрос на отправку данных. При помощи метода POST мы, например, можем передать данные после заполнения формы на сайте. Его синтаксис аналогичен синтаксису GET и HEAD заголовков, но от запроса GET он отличается тем, что вместо содержимого документа подаются параметры и значения. В POST-запросе необходимо указывать длину передаваемых данных (Content-Length), и тип передаваемых данных (Content-Type).

Пример — POST-запрос при логине в соцсети vkontakte.ru:

Нам интересна последняя строка, в которой передается логин и пароль для авторизации на сайте.

Чтобы успешно залогиниться на сайте, надо не только уметь посылать «правильные запросы», но и правильно интерпретировать ответы сервера. Например, в ответ на посланный нами запрос, сервер вернет нам:

Тем самым в браузере, обращающемся к веб-серверу, устанавливаются определенные кукисы.

Пожалуй, на сегодня информации хватит. В следующих сериях смотрите:
— чем можно просмотреть HTTP-заголовки;
— пример использования компонентов Indy для авторизации на сайте.

Чтобы быть в курсе обновлений блога, можно подписаться на RSS.

Информационные технологии, интернет, веб программирование, IT, Hi-Tech, …

XML на Сервере

Здравствуйте, уважаемые читатели блога okITgo.ru! Данная статья рассказывает о создании XML документов на сервере. Действительно, XML документы могут легко храниться и генерироваться на обычном веб сервере, т.к. xml файлы являются обыкновенными тектовыми файлами, как и HTML файлы.

Хранение XML Файлов на Сервере

XML файлы можно хранить на Интернет сервере так же, как и HTML файлы.

Откройте Блокнот Windows и напишите следующие строки:

12.09.2013, 20:19 #9

Света
Вася
Позвони мне завтра!

Сохраните файл на вашем веб сервере с подходящим именем, например «note.xml».

Генерация XML посредством ASP (Active Server Pages – Динамические Серверные Страницы)

XML можно генерировать на сервере без установки какого-либо программного обеспечения для работы с XML.

Чтобы создать XML на сервере – просто напишите следующий код и сохраните его как ASP файл на веб сервере:

«)
response.Write(» «)
response.Write(» Света «)
response.Write(» Вася «)
response.Write(» Позвони мне завтра! «)
response.Write(» «)
%>

Заметьте, что тип содержимого (content type) ответа должен быть установлен в «text/xml».

Генерация XML посредством PHP

Для генерации XML на сервере с помощью PHP, используйте следующий код:

«;
echo » «;
echo » Света «;
echo » Вася «;
echo » Позвони мне завтра! «;
echo » «;
?>

Заметьте, что тип содержимого (content type) ответа должен быть установлен в «text/xml».

Генерация XML Из Базы Данных на Сервере

XML может быть сгенерирован из базы данных без установки какого-либо дополнительного софта для работы с XML.

Чтобы создать XML из бд на сервере, просто напишите следующий код и сохраните его как ASP файл на этом веб сервере:

«)
response.write(» «)
while (not rs.EOF)
response.write(» «)
response.write(» » & rs(«fname») & » «)
response.write(» » & rs(«lname») & » «)
response.write(» «)
rs.MoveNext()
wend

rs.close()
conn.close()
response.write(» «)
%>

Пример выше использует взаимодействие ASP и ADO.

Трансформация XML посредством XSLT на Сервере

Этот ASP код трансформирует XML файл в XHTML на сервере:

  • Первый блок кода создает экземпляр Microsoft XML парсера (XMLDOM), и загружает XML файл в память.
  • Второй блок кода создает другой экземпляр парсера и загружает XSL файл в память.
  • Последняя строка кода трансформирует XML документ с использованием XSL документа и посылает результат как XHTML в ваш браузер.

Сохранение XML в Файл на Сервере, Используя ASP

Этот ASP-пример создает простой файл XML на сервере:

Илон Маск рекомендует:  Что такое код pdf_fill_stroke
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL