Работа с WinInet, демо получения HTML-кода страницы
01.01.2007
//////////////////////////////////////////////////////////////////////////////// // // Демо получения HTML кода страницы // Автор: Александр (Rouse_) Багель // © Fangorn Wizards Lab 1998 - 2003 // 19 января 2003 unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ComCtrls, Wininet, StdCtrls; const HTTP_PORT = 80; CRLF = #13#10; Header = 'Content-Type: application/x-www-form-urlencoded' + CRLF; type TForm1 = class(TForm) Button1: TButton; Memo1: TMemo; Button2: TButton; Memo2: TMemo; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); end; var Form1: TForm1; implementation {$R *.dfm} function DelHttp(URL: String): String; begin if Pos('http://', URL) > 0 then Delete(Url, 1, 7); Result := Copy(Url, 1, Pos('/', Url) - 1); if Result = '' then Result := URL + #0; end; function GetUrl(const URL: String): String; var FSession, FConnect, FRequest: HINTERNET; FHost, FScript, SRequest: String; Ansi: PAnsiChar; Buff: array [0..1023] of Char; BytesRead: Cardinal; Res, Len: DWORD; begin Result := ''; // Небольшой парсинг // вытаскиваем имя хоста и параметры обращения к скрипту FHost := DelHttp(Url); FScript := Url; Delete(FScript, 1, Pos(FHost, FScript) + Length(FHost)); //FScript := FHost + '/' +FScript; // Инициализируем WinInet FSession := InternetOpen('DMFR', INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0); if not Assigned(FSession) then Exit; try // Попытка соединения с сервером FConnect := InternetConnect(FSession, PChar(FHost), HTTP_PORT, nil, 'HTTP/1.0', INTERNET_SERVICE_HTTP, 0, 0); if not Assigned(FConnect) then Exit; try // Подготавливаем запрос страницы Ansi := 'text/*'; FRequest := HttpOpenRequest(FConnect, 'GET', PChar(FScript), 'HTTP/1.1', nil, @Ansi, INTERNET_FLAG_RELOAD, 0); if not Assigned(FConnect) then Exit; try // Добавляем заголовки if not (HttpAddRequestHeaders(FRequest, Header, Length(Header), HTTP_ADDREQ_FLAG_REPLACE or HTTP_ADDREQ_FLAG_ADD or HTTP_ADDREQ_FLAG_COALESCE_WITH_COMMA)) then Exit; // Проверяем запрос: Len := 0; Res := 0; SRequest := ' '; HttpQueryInfo(FRequest, HTTP_QUERY_RAW_HEADERS_CRLF or HTTP_QUERY_FLAG_REQUEST_HEADERS, @SRequest[1], Len, Res); if Len > 0 then begin SetLength(SRequest, Len); HttpQueryInfo(FRequest, HTTP_QUERY_RAW_HEADERS_CRLF or HTTP_QUERY_FLAG_REQUEST_HEADERS, @SRequest[1], Len, Res); end; Form1.Memo2.Lines.Text := SRequest; // Отправляем запрос if not (HttpSendRequest(FRequest, nil, 0, nil, 0)) then Exit; // Получаем ответ FillChar(Buff, SizeOf(Buff), 0); repeat Result := Result + Buff; FillChar(Buff, SizeOf(Buff), 0); InternetReadFile(FRequest, @Buff, SizeOf(Buff), BytesRead); until BytesRead = 0; finally InternetCloseHandle(FRequest); end; finally InternetCloseHandle(FConnect); end; finally InternetCloseHandle(FSession); end; end; procedure TForm1.Button1Click(Sender: TObject); begin Memo1.Text := GetUrl('http://forum.sources.ru/index.php?showforum=14'); end; procedure TForm1.Button2Click(Sender: TObject); begin Memo1.Text := GetUrl('http://forum.sources.ru/'); end; end.
Проект также доступен по адресу: http://rouse.front.ru/loadhtml.zip
Взято из https://forum.sources.ru