Если Вы часто работаете с 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 и др.
|
А если мне надо элементарно открыть с винчестера xml док(в нутри дерево с кучей новостей для WP сайта).Между тегами взять шапку и содержание новости, перейти к следуйщей. В процесе понадобится приостановка обработки и ее продолжение с места где остановился. Не могу понять какие имено стандартные модули использовать. (xmldoc, xmldom, xmlIntf, msxml) или MSXML_TLB может ещё чтото есть?. Рунете добрая куча статей, ещё больше куча советов. И я запутался(((
Так с чем удобнее с тем и надо работать. В чем проблема-то? Мне NativeXML нравится — я с ним в последнее время работаю. Понадобится MSXML использовать — подключу msxml и начну использовать его
Записываю данные после парсинга в ListView в два столбца. Хочу вывести строку со второго столбца в edit, но получается вывести только с первого edit1.Text:=lv.Items[1].Caption; А как зделать запрос на столбец?
Почитать информацию по ListView и воспользоваться другим свойством
А другое свойтсво называется SubItems :). все столбцы хранятся в нем в виде списка (кроме первого).
[…] работу с библиотекой MSXML_TLB я прочитал на блоге WebDelphi. Там автор довольно подробно […]