![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Послать запрос скрипту на сервере и получить ответ [D5, WinXP]
TButton © (2005-01-10 19:09:00)Доброго времени суток, господа умные дядьки и тетьки (если таковые имеются)
Задача (см. сабж):
есть некий сервер, на котором есть некий скрипт, полуающий запросы и выдающий ответы.
нужно программно послать запрос и получить ответ.
используя для этого TClientSocket.
Например (чистая абстракция):
http://www.marcuch.ru/lib.pl?theme=Delphi
возвращает страницу со списком, скажем ссылок на F.A.Q.
ПыСы
Искал по форуму и сайту, ничего не нашел, наверное хреново искал.
ПыПыСы
буду рад и совету, и ссылке, и коду (главное - чтоб в тему)
Seeker (2005-01-11 10:48:00) [1]
> Rouse_ ©
Код конечно правильный, но есть маленький нюанс.Если взять снифер и посмотреть отправляемые заголовки, то можно увидеть что неизвестно откуда к 'text/*' добавляется всякий мусор.На многих серверах это проходит,но есть такие где это не проходит.
В этом случае строку
Ansi := 'text/*';
нужно заменить на
FillChar(Ansi, SizeOf(''), 0);
аHeader = 'Content-Type: application/x-www-form-urlencoded' + CLRF;наHeader = 'text/*'+CLRF+'Content-Type: application/x-www-form-urlencoded' + CLRF;
Тогда этот мусор пропадет.
Piter (2005-01-11 09:45:00) [2]типа, типа...
Что значит универсальный?
TButton (2005-01-11 00:58:00) [3]т.е. типа, вариант универсальный?
Piter (2005-01-11 00:12:00) [4]TButton © (10.01.05 23:52) [4]
каков смысл ее значения?
Указывает какой тип контента готов принять клиент.
Piter © (10.01.05 20:18) [3]
Потому что некоторые скрипты могут возвращать совсем не то, если не указать данный параметр в заголовке HTTP пакета
TButton (2005-01-10 23:52:00) [5]
> каково значение константы header
пардон, не правильно выразился. каков смысл ее значения?
Piter (2005-01-10 20:18:00) [6]TButton © (10.01.05 20:08) [2]
каково значение константы header
В примере же явно указано:
Header = 'Content-Type: application/x-www-form-urlencoded' + CLRF;
и это очень грамотно. Потому что некоторые скрипты могут возвращать совсем не то, если не указать данный параметр в заголовке HTTP пакета.
TButton (2005-01-10 20:08:00) [7]благодарю. а можно вопрос?
каково значение константы header
я так предполагал что там будет text/html
Rouse_ (2005-01-10 19:46:00) [8]
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
Dialogs, ComCtrls, Wininet, StdCtrls;
const
HTTP_PORT = 80;
CLRF = #13#10;
Header = 'Content-Type: application/x-www-form-urlencoded' + CLRF;
type
TForm1 = class(TForm)
Button1: TButton;
Memo1: TMemo;
procedure Button1Click(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;
end;
function GetUrl(const URL: String): String;
var
FSession, FConnect, FRequest: HINTERNET;
FHost, FScript: String;
Ansi: PAnsiChar;
Buff: array [0..1023] of Char;
BytesRead: Cardinal;
begin
Result := '';
// Небольшой парсинг
// вытаскиваем имя хоста и параметры обращения к скрипту
FHost := DelHttp(Url);
FScript := Url;
Delete(FScript, 1, Pos(FHost, FScript) + Length(FHost));
// Инициализируем 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.0',
'', @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)) then Exit;
// Отправляем запрос
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://www.marcuch.ru/lib.pl?theme=Delphi');
end;
end.