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
1uses
2 IdHTTP;
3
4…
5
6var
7 s: string;
8 IdHTTP: TIdHTTP;
9begin
10 IdHTTP:= TIdHTTP.Create(nil);
11 try
12
13 s:=IdHTTP.Get('http://www.test.com');
14 finally
15 IdHTTP.Free;
16 end;
17end;
Stejně jednoduše lze zaslat požadavky Post, Head …
1uses
2 IdHTTP;
3
4…
5
6var
7 s: string;
8 IdHTTP: TIdHTTP;
9 post: TStringList;
10begin
11 IdHTTP:= TIdHTTP.Create(nil);
12 post:=TStringList.Create;
13 try
14 post.Add('info=text');
15 s:=IdHTTP.Post('http://www.test.com/', post);
16 finally
17 IdHTTP.Free;
18 post.Free;
19 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.
1procedure TFormNeco.IdHTTP1Status(ASender: TObject; const AStatus: TIdStatus;
2 const AStatusText: string);
3begin
4
5end;
6
7procedure TFormNeco.IdHTTP1Work(ASender: TObject; AWorkMode: TWorkMode;
8 AWorkCount: Int64);
9begin
10
11end;
12
13
14
15IdHTTP.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.