Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Загрузка части страницы методом Post (idhttp) [D7, WinXP]


free)styler ©   (2006-09-15 22:35:00) 

Объясните пожалуйста как, если вообще возможно, методом post загрузить только часть страницы т.к. мне не нужен весь код а только его начало. хочу съэкономить трафик.
Заранее спасибо!


free)styler   (2006-09-17 21:36:00) [1]

Спасибо огромное всё получилось!!


Dmitrij_K   (2006-09-17 17:07:00) [2]

Ну вот примерно так
unit Unit2;

interface

uses
 Classes, IdHTTP, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient;

type
 HTTPTHREAD = class(TThread)
 private
   { Private declarations }
   procedure IdHTTPWork(ASender: TObject; AWorkMode: TWorkMode; AWorkCount: Integer);
 protected
   procedure Execute; override;
 end;

implementation

{ Important: Methods and properties of objects in visual components can only be
 used in a method called using Synchronize, for example,

     Synchronize(UpdateCaption);

 and UpdateCaption could look like,

   procedure HTTPTHREAD.UpdateCaption;
   begin
     Form1.Caption := 'Updated in a thread';
   end; }

{ HTTPTHREAD }

procedure HTTPTHREAD.Execute;
var idhttp : TIdhttp;
   s      : TStringStream;
begin
 s      := TStringStream.Create('');
 idhttp := TIdhttp.Create(nil);
 idhttp.RecvBufferSize := 512; // будет чаще вызываться OnWork
 try
   idhttp.OnWork := IdHTTPWork;
   try      IdHTTP.Get(' http://img79.imageshack.us/img79/4773/20060311haskawallpapersruvesna20061024x768a101523rk1.jpg', s);
   except
   end;
   if s.Size>1000 then // OK
   begin
   // s.DataString
   end
 finally
   idhttp.Free;
   s.Free;
 end;
end;

procedure HTTPTHREAD.IdHTTPWork(ASender: TObject; AWorkMode: TWorkMode;
 AWorkCount: Integer);
begin
 if AWorkMode=wmRead then
   if AWorkCount>1000 then
     (ASender as TIdHTTP).Socket.Close
end;

end.


free)styler   (2006-09-17 16:24:00) [3]

Спасибо с этим разобрался!
а скажите пожалуйста как программно связать IDHTTP И IdLogEvent?
и как выполнить программно процедуру OnReceived?
просто пытаюсь сделать в программе отдельный поток при выполнении этого запроса.
вот код:
procedure test.Execute;
var
Request : TStringList;
begin
freeonterminate:=true;
request:=tstringlist.Create;
request.Add('Login=my_log');
request.Add('Password=my_pass');
idhttp:=TIdhttp.Create(nil);
IdLogEvent1:=tIdLogEvent.Create(nil);
try
idhttp.HandleRedirects:=true;
fresult:=idhttp.Post(' http://class.avtograd.ru/v2/Detect.Asp',request);
Synchronize(answer);
finally
end;
end;
Пробую выполнить так:
IdLogEvent1.onreceived(idhttp,adata,'')
но adata пустой.
помогите!


Dmitrij_K   (2006-09-16 22:34:00) [4]

для 9 инди
подключи к idHTTP IdLogEvent (Indy Intercepts) в нем лови OnReceived параметр aData - это пришедшие данные, копи их в своем буфере, а потом когда скачаешь сколько надо, делай
(ASender as TIDHttp).Socket.Close;
А вызов IdHTTP.Post сделай в try except , тк разрыв сокета вызовет исключение.


free)styler   (2006-09-16 21:52:00) [5]


>  Ответ получаешь по кускам и анализируешь.

вот именно это то и интересно. я понимаю что когда получаю нужную часть рвать соединение но как именно часть получить?


Ketmar   (2006-09-16 16:27:00) [6]

> [9] Орион ©   (16.09.06 16:23)
я тоже индейцев редко использую. но у меня и задачи мелкие. %-)


Орион   (2006-09-16 16:23:00) [7]

> [8] Ketmar ©   (16.09.06 16:18)

я бы свой велосипед написал, точней уже написал :)


Ketmar   (2006-09-16 16:18:00) [8]

> [7] Орион ©   (16.09.06 16:16)
почему не добьёшся? что, в инди уже запретили свойства "range" (или как их там зовут)?


Орион   (2006-09-16 16:16:00) [9]

> [6] free)styler   (16.09.06 12:47)

> я просто где то что можно как то задать в байтах величину ответа сервера после POSTа.
нельзя.

Чем POST запрос делаешь? TidHTTP? От него ничего не добьешся.

Я же написал в [3]. Формируешь руками пост запрос. Отсылаешь серверу. Ответ получаешь по кускам и анализируешь. Когда нужная тебе инфа загрузилась, рвешь соединение.
Все просто как 5 копеек. Но вот код тебе писать никто не будет. Хотя... WMZ есть?)))))


free)styler   (2006-09-16 12:47:00) [10]

методом post я запрашиваю страницу статистики. в строковую переменную получаю код страницы. нужная часть, т.е цифры показывающие остаток на счете, находятся в примерно в середине этого html кода, т.е загружать полностью страницу не имеет смысла. так вот суть вопроса и заключалась в том чтобы загрузить страницу именно с той частью кода и всё, дабы остальное абсолютно не нужно. это возможно? я просто где то что можно как то задать в байтах величину ответа сервера после POSTа. но потерял этот форум. решил обратиться суда.


Орион   (2006-09-16 12:34:00) [11]

> [4] free)styler   (16.09.06 11:20)

Что такое "примерно", "середина" и "нужная часть"?


free)styler   (2006-09-16 11:20:00) [12]

> Почему нельзя?ИМХО можно... правда только с начала...Типа
> когда нужная часть загрузится то сражу же рвать соединение.

мне нужно загрузить только примерно до середины страницу. а как отсделить что нужная часть уже скачена?


Орион   (2006-09-15 23:15:00) [13]

> [0] free)styler   (15.09.06 22:35)

TIdTCP + rfc по http и будет тебе счастье.


SergP   (2006-09-15 23:06:00) [14]

> [1] Eraser ©   (15.09.06 22:53)
> > [0] free)styler   (15.09.06 22:35)
>
> методом Post - нельзя.


Почему нельзя?
ИМХО можно... правда только с начала...
Типа когда нужная часть загрузится то сражу же рвать соединение.


Eraser   (2006-09-15 22:53:00) [15]

> [0] free)styler   (15.09.06 22:35)

методом Post - нельзя.


Наверх

Титульная страница Поиск, карта сайта Написать письмо