Работа с протоколом http

В предыдущей главе мы рассмотрели пример быстрого создания браузера. Однако, как мы помним, применяемое решение функционально повторяло Internet Explorer. Что мы можем сделать, чтобы уйти от этого ограничения?

Если мы хотим создать свой собственный браузер, который быстро потеснит на рынке Internet Explorer, Netscape Navigator и Opera вместе взятые, одного компонентаWebBrowser со страницы компонентовInternet будет явно недостаточно. Более или менее приличный браузер должен сам интерпретировать HTML, что требует получения чистого потока данных HTTP-протокола (HyperText Transfer Protocol, протокол передачи гипертекста). Как это реализовать? Берем компонент NMHTTP со страницы компонентовFastNet. Ну а как он работает? Главное — это метод Get, в качестве параметра которому передается строка, содержащая URL. А вот куда направляется поток данных, зависит от свойства InputFileMode типа Boolean. В случае, если это свойство установлено в True, заголовок и тело документа, получаемого с указанного URL, помещаются в текстовый и HTML-документы, соответственно. Имена соответствующих файлов указаны в свойствах Header и Body. В том случае, когда InputFileMode установлен в False, эти данные сохраняются в виде строковых значений непосредственно в этих свойствах. Таким образом, для отработки отображения HTML-текста необходимо правильно распознавать и отображать тэги.

Что еще требуется знать для работы с NMHTTP? Свойства BytesRecvd, BytesSent и BytesTotal типа longint показывают количество принятых и переданных байтов, а также общее количество байтов в получаемом документе. Свойство Port типа integer указывает номер порта, на котором функционирует Web-сервер, по умолчанию — 80. Если в нашей работе используется proxy-сервер, то его IP-адрес в виде строки записывается в свойство Proxy.

Свойства UserId и Password задают, соответственно, пользователя и его пароль. Правда, эти свойства находятся в составе сложного свойства Headerinfo.

Помимо приема данных с какого-либо URL иногда необходимо их и передавать. Для этого используется метод Post, которому в качестве параметров передаются URL и строка, указывающая на передаваемые данные, в виде двух переменных типа String. В том случае, если свойство OutputFileMode установлено в True, то в этой строке указывается имя файла, в котором хранятся данные, подготовленные для передачи. В случае, если OutputFileMode установлено в False, в строке хранятся сами данные.

Метод Abort экстренно прерывает сеанс связи. Понятно, что обычно вызов этого метода вешается на кнопку разрыва связи.

Используя компонент MNHTTP, можно также реализовать такую экзотическую возможность, как перенос документа с одного URL на другой. Для этого используется метод Move, который физически переносит документ с одного URL на другой. URL-источник и URL-приемник указываются в виде строковых параметров метода. Очень близко к этому методу находится и метод Copy, который физически копирует документ с одного URL на другой.

Теперь рассмотрим пример. На основную форму мы поместим два компонентаMemo, в которые будем помещать тело полученного документа (свойство Body) и заголовок (свойство Header). Помимо этого нам потребуется один компонентEdit для ввода URL и кнопка для запуска процесса получения документа с этого URL. Понадобится также одна строка состояния (компонентStatusBar). И еще установим дополнительную кнопку на основной форме, которая будет осуществлять вызов формы для ввода дополнительной информации — такой как пароль и идентификатор пользователя, IP-адрес proxy-сервера и номер порта, на котором функционирует тот Web-сервер, к которому мы будем обращаться. И, естественно, нам потребуется один компонент NMHTTP. (Звучит, как кулинарный рецепт. Положите то, добавьте это, соль и перец — по вкусу.)

Кроме того, в нашем примере используются некоторые события ключевого компонента NMHTTP. В строке состояния мы указываем количество полученных байтов. Этот обработчик можно вешать только на событие OnPacketRecvd, которое регулярно наступает при получении информации от ее источника. Использовано также событие OnStatus, выполняемое при изменении у компонента NMHTTP свойства Status. В нашем примере оно применяется только для обработки ошибки, связанной с отсутствием сайта по указанному URL. Всего в нашем маленьком проекте два файла. Попробуйте разобраться с их листингами.

Листинг файла 1:

unit Unit1;

interface

uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

Psock, NMHttp, StdCtrls, ComCtrls, ExtCtrls;

type

TForm1 = class(TForm)

Panel 1: TPanel;

Edit1: TEdit;

Button1: TButton;

StatusBar1: TStatusBar;

Memol: TMemo;

Memo2: TMemo;

NMHTTP1: TNMHTTP;

Button3: TButton;

procedure Button3Click(Sender: TObject);

procedure NMHTTPlPacketRecvdtSender: TObject);

procedure Button1ClicktSender: TObject);

procedure NMHTTP1Status (Sender: TComponent; Status: Strings);

private { Private declarations }

public { Public declarations }

end;

var

Form1: Tform1;

implementation

uses Unit2;

{$R *.DFM}

procedure TForml.Button3Click(Sender: TObject);

begin

Form2.Show;

end;

procedure TForml.NMHTTPlPacketRecvd(Sender: TObject);

begin

StatusBar1.SimpleText:= IntToStr(NMHTTP1.BytesRecvd) + ‘из’ +IntToStr(NMHTTP1.BytesTotal) + ‘получено’ ;

end;

procedure TForml.Button1Click (Sender: TObject);

begin

MNHTTP1.InputFileMode:=False;

MNHTTP2.Get(Edit1.Text);

Memo2.Text:=MNHTTP1.Header;

Memo1.Text:=MNHTTP1.Body;

StatusBar1.SimpleText:= ‘Обработка закончена’;

end;

procedure TForml.MNHTTPStatus (Sender: TComponent; Status: String);

begin

if MNHTTP1.ReplyNumber = 404 then

StatusBar1.SimpleText:= ‘Объект не найден’;

end;

end.

6. Web-технологии. Протокол HTTP | Технострим

Похожие статьи:

Понравилась статья? Поделиться с друзьями:
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!:

Adblock
detector