![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Загрузка части страницы методом 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 - нельзя.