уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.

Если Вы часто работаете с XML-документами, которые расположены на каком-либо сервере и используете в работе MSXML, то вполне возможно, что Вам нет большой необходимости использовать всю мощь библиотек типа Synapse, Indy или ICS для работы в Сети, достаточно получить документ, обработать и отправить обратно.
Для выполнения этих простых операций Вам может в этом случае пригодиться один из интерфейсов из MSXML, который называется — IXMLHttpRequest. Довольно удобный в плане использования интерфейс, который обеспечит для Вас поддержку работы с HTTP-протоколом. Рассмотрим подробнее как можно осуществить обмен данными с сервером, используя возможности IXMLHttpRequest.

1. Получение данных методом GET

В качестве примера, скачаем страницу из Сети.

procedure GetPage;
var
  req: IXMLHttpRequest;
  PageTest:string;
begin
  req := {$IFDEF VER210}CoXMLHTTP{$ELSE}CoXMLHTTPRequest{$ENDIF}.Create;
  req.open('GET', 'http://www.google.com/', false, EmptyParam, EmptyParam);
  req.send(EmptyParam);
  PageText:=req.responseText;
end;

Ничего особенного процедура не выполняет, просто сохраняет полученные данные в переменную PageText. Рассмотрим, что мы здесь написали.

 req := {$IFDEF VER210}CoXMLHTTP{$ELSE}CoXMLHTTPRequest{$ENDIF}.Create;

Создаем экземпляр класса CoXMLHTTP.

 req.open('GET', 'http://www.google.com/', false, EmptyParam, EmptyParam);

Инициализируем запрос. Метод open имеет следующие параметры:

procedure open(const bstrMethod: WideString; const bstrUrl: WideString; varAsync: OleVariant; bstrUser: OleVariant; bstrPassword: OleVariant);

bstrMethod: WideString — метод, которые мы используем для запроса.
const bstrUrl: WideString — URL на который мы отправляем запрос.
varAsync: OleVariant — если значение этого параметра равно True, то запрос будет выполнен асинхронно и для того, чтобы узнать результат его выполнения необходимо дополнительно определить свойство onreadystatechange: IDispatch;
bstrUser: OleVariant — имя пользователя для аутентификации на сервере.
bstrPassword: OleVariant — пароль.

req.send(EmptyParam);

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

PageText:=req.responseText;

Присвоили переменной текст ответа сервера.
В этом примере мы получили текст HTML-страницы. Теперь допишем немного процедуру и получим уже не просто текст, а именно XML-документ. Например, получим XML-документ, содержащий актуальные посты из фида блога WebDelphi.

procedure TForm7.Button1Click(Sender: TObject);
var req: IXMLHttpRequest;
    XML: IXMLDOMDocument2;
begin
  req:={$IFDEF VER210}CoXMLHTTP{$ELSE}CoXMLHTTPRequest{$ENDIF}.Create;
  req.open('GET', 'http://feeds.feedburner.com/myDelphi?format=xml', false, EmptyParam, EmptyParam);
  req.send(EmptyParam);
  XML:=CoDOMDocument.Create;
  XML.async := false;
  XML:=req.responseXML as IXMLDOMDocument2;
   Memo1.Text:=XML.xml
end;

Здесь мы записали в Memo1 весь исходник XML-документа.

2. Отправка данных методом POST

Теперь посмотрим, как можно работать через интерфейс IXMLHttpRequest с POST запросами. На самом деле все также просто как и в предыдущем примере. Например, воспользуемся IXMLHttpRequest для работы с Google. Используя responseText, проведем аутентификацию в сервисах Google:

procedure TForm7.Button1Click(Sender: TObject);
var req: IXMLHttpRequest;
    Body: String;
begin
  req:={$IFDEF VER210}CoXMLHTTP{$ELSE}CoXMLHTTPRequest{$ENDIF}.Create;
  req.open('POST', 'https://www.google.com/accounts/ClientLogin', false, EmptyParam, EmptyParam);
  req.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
  body:='accountType=HOSTED_OR_GOOGLE&Email=мыло&Passwd=пароль&service=xapi&source=companyName-applicationName-versionID';
  req.send(body);
  Memo1.Text:=Req.responseText
end;

Здесь мы без проверок чего-либо получили в Memo1 данные, необходимые для работы с сервисами Гугл.
Если Вам необходимо отслеживать состояние запроса, то дополнительно Вы можете воспользоваться следующими свойствами:

property readyState: Integer read Get_readyState;

Можно использовать для отслеживания состояния Вашего запроса. Возвращает одно из следующих значений:
0 — объект создан, но не инициализирован (метод open не выполнялся)
1 — объект создан, инициализирован, но ещё не выполнен метод send
2 — метод send был выполнен, но на данный момент не получен ответ
3 — «в работе». То есть какая-то часть данных уже была получена/отправлена, но запрос ещё не завершен.
4 — Запрос выполнен, responseText и responseBody содержат актуальные данные.

property status: Integer read Get_status;

Возвращает код ответа сервера, например 200, 404, 302 и т.д.

property statusText: WideString read Get_statusText;

Возвращает ответ сервера в виде строки — Ok, Moved и т.д.
Ну и, если Вас интересуют данные, содержащиеся в заголовках ответа, то можно воспользоваться следующими методами:

function getResponseHeader(const bstrHeader: WideString): WideString; safecall;

Возвращает значение заголовка по его названию

function getAllResponseHeaders: WideString; safecall;

Возвращает текст всех полученных заголовков.

Книжная полка

Описание: Рассмотрены практические вопросы по разработке клиент-серверных приложений в среде Delphi 7 и Delphi 2005 с использованием СУБД MS SQL Server 2000, InterBase и Firebird. Приведена информация о теории построения реляционных баз данных и языке SQL. Освещены вопросы эксплуатации и администрирования СУБД.
купить книгу delphi на ЛитРес
Описание: Рассмотрены малоосвещенные вопросы программирования в Delphi. Описаны методы интеграции VCL и API. Показаны внутренние механизмы VCL и приведены примеры вмешательства в эти механизмы. Рассмотрено использование сокетов в Delphi: различные режимы их работы, особенности для протоколов TCP и UDP и др.
купить книгу delphi на ЛитРес
0 0 голоса
Рейтинг статьи
уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.
Подписаться
Уведомить о
6 Комментарий
Межтекстовые Отзывы
Посмотреть все комментарии
Юрик
Юрик
24/10/2010 02:12

А если мне надо элементарно открыть с винчестера xml док(в нутри дерево с кучей новостей для WP сайта).Между тегами взять шапку и содержание новости, перейти к следуйщей. В процесе понадобится приостановка обработки и ее продолжение с места где остановился. Не могу понять какие имено стандартные модули использовать. (xmldoc, xmldom, xmlIntf, msxml) или MSXML_TLB может ещё чтото есть?. Рунете добрая куча статей, ещё больше куча советов. И я запутался(((

Юрик
Юрик
24/10/2010 19:35

Записываю данные после парсинга в ListView в два столбца. Хочу вывести строку со второго столбца в edit, но получается вывести только с первого edit1.Text:=lv.Items[1].Caption; А как зделать запрос на столбец?

SeregaAltmer
25/10/2010 00:22

А другое свойтсво называется SubItems :). все столбцы хранятся в нем в виде списка (кроме первого).

trackback

[…] работу с библиотекой MSXML_TLB я прочитал на блоге WebDelphi. Там автор довольно подробно […]