Opět přicházím s malým článkem pro využití komponent Indy.
Nyní přináším drobné základy pro komunikaci pomocí protokolu HTTP a nabízím
alternativu k Synapse, které ve svém článku popsal Radek - viz.
komunikace přes HTTP pomocí Synapse.
Jen pro připomenutí - něco o Indy a aktualizaci na nejnovější verzi.
Malé drobnosti jsem zapomněl podotknout - Indy jsou komponenty, proto není potřebné
vše vytvářet v kódu. Na rozdíl od Synapse, Indy lze jednoduše položit na formulář.
A protože jde o synchronní přenos, při spuštění "práce" hlavní formulář zamrzne.
Samozřejmě, nejlepší řešení je vytvořit si vlákno. Pro ty, kteří nemají tolik
znalostí nebo času, stačí vytvořit / položit na formulář komponentu IdAntiFreeze a
máte vystaráno (tato komponenta sama zajistí, aby formulář byl jakž takž přístupný).
Nyní už velmi jednoduchý příklad pro stažení stránky
uses
IdHTTP;
…
var
s: string;
IdHTTP: TIdHTTP;
begin
IdHTTP:= TIdHTTP.Create(nil);
try
// do "s" je ulozen text
s:=IdHTTP.Get('http://www.test.com');
finally
IdHTTP.Free;
end;
end;
Stejně jednoduše lze zaslat požadavky Post, Head …
uses
IdHTTP;
…
var
s: string;
IdHTTP: TIdHTTP;
post: TStringList; // seznam parametru <form>
begin
IdHTTP:= TIdHTTP.Create(nil);
post:=TStringList.Create;
try
post.Add('info=text'); // v HTML je to <input name="info" value="text">
s:=IdHTTP.Post('http://www.test.com/', post);
finally
IdHTTP.Free;
post.Free;
end;
Samozřejmě stažená data není potřeba dávat do stringu. Indy umí stáhnout
data do následníka TStream, který je v parametru, a dál s tím pracovat (stažení do souboru).
IdHTTP.Get('http://www.test.com/', stream);
V případě ukládání do stringu je možné specifikovat i kódování, jinak se Indy
pokouší automaticky rozpoznat.
Indy samozřejmě podporují mnoho standardních nastavení.
Proxy
IdHTTP.ProxyParams.ProxyServer:=server;
IdHTTP.ProxyParams.ProxyPort:=port;
IdHTTP.ProxyParams.ProxyUsername:=username;
IdHTTP.ProxyParams.ProxyPassword:=password;
IdHTTP.ProxyParams.BasicAuthentication:=True;
Mnoho nastavení lze najít pod IdHTTP.Request.
Co se týče průběhu a statusu, tyhle dvě procedury Vám pomohou.
Případně u komponent se vytváří samy v Events.
procedure TFormNeco.IdHTTP1Status(ASender: TObject; const AStatus: TIdStatus;
const AStatusText: string);
begin
end;
procedure TFormNeco.IdHTTP1Work(ASender: TObject; AWorkMode: TWorkMode;
AWorkCount: Int64);
begin
end;
//a pak to lze použít třeba takto …
IdHTTP.OnWork:=IdHTTP1Work;
Nakonec ještě dodám, že je vhodné Get, Post apod. ošetřit pomocí tohoto,
protože Indy pomocí toho vrací chybové kódy 404, 500 apod.
try
Get …
except
on E: Exception
…
end;
No, kdyby někomu nebylo něco jasné, lze dodat více informací.
Každopádně jde toho hodně objevit.