Aplikace Delphi odesílá data na server pomocí metody POST (Indy). Indy komponenty používané v Delphi

Indy je poměrně výkonný balík komponent, který umožňuje vyvíjet různé síťové aplikace. V tomto tutoriálu vám řeknu, jak můžete vytvořit aplikace klient-server pomocí komponent TIdTCPClient a TIdTCPServer.

Nejprve bych rád poznamenal dvě důležité výhody těchto komponent. Nejdůležitější z nich je multithreading, což znamená, že server vytváří samostatné vlákno pro každého klienta, což jistě ovlivňuje výkon serverového programu na počítačích s vícejádrovým procesorem. Druhou výhodou je snadné použití. K napsání jednoduché klient-server aplikace stačí 10-20 řádků kódu. Tento balíček komponent je přítomen ve standardních sestavách Delphi.

Pojďme psát jednoduchý program, který umožňuje přenést textovou zprávu z klienta na server. Začneme vytvářet server.
Umístíme komponentu IdTCPServer ze záložky „Indy Servers“ na formuláři. Všechna nastavení pro tuto komponentu provedeme za běhu v události OnCreate formuláře:
IdTCPServer1.DefaultPort:= 12345;
IdTCPServer1.Active:= true;
Zde je vše jednoduché - označíme port, na kterém bude server pracovat, a aktivujeme samotný server.

Pro příjem dat na server od klienta existuje speciální událost „OnExecute“. Tato událost vypadá takto:

začít
konec;

Upravme obsah události následovně:
procedure TForm3.IdTCPServer1Execute(AContext: TIdContext);
var
l:string; // řetězcová proměnná, do které budeme přijímat
začít
l:= AContext.Connection.IOHandler.ReadLn();
Memo1.Lines.Add(l);
konec;

Nyní, jakmile zpráva dorazí na server, zapíšeme ji do řetězcové proměnné l a vypíšeme ji do víceřádkového textového pole.

Tím není překvapivě vytváření serveru ukončeno. Indy za nás udělá zbytek. Začněme klientským programem. Připojí se k serveru, odešle na něj zprávu a odpojí se od serveru.

Pojďme tvořit nový projekt, umístěte komponentu IdTCPClient do formuláře, který najdete na záložce „Indy Clients“. Umístíme také jednoduchou Úpravu a tlačítko. Vytvořme ovladač události OnClick pro tlačítko, do kterého napíšeme:
IdTCPClient1.Port:= 12345;
IdTCPClient1.Host:= '127.0.0.1';
IdTCPClient1.Connect;
IdTCPClient1.IOHandler.WriteLn(Edit1.Text);
IdTCPClient1.Odpojit;

Tento kód není nutné vkládat do události OnCreate. Pokud si přejete, můžete tento kód umístit kamkoli chcete.
V prvním řádku přiřadíme port a je nutné zadat stejný port, který jsme zadali v programu serveru, jinak klient server prostě nenajde. Poté uvedeme IP adresu serveru. Samotný server může být umístěn buď v lokální síť a na dálku. V druhém případě bude připojení provedeno přes internet a budete muset zadat IP adresu na internetu.

Zadal jsem adresu „127.0.0.1“, což znamená, že server je počítač, na kterém běží klient. Tato metoda je velmi vhodná pro testování síťových aplikací.
Poté navážeme spojení, odešleme zprávu a odpojíme se.Stejně jako zprávu samotnou, i IP adresu můžete převzít z Editu nebo z libovolné řetězcové proměnné.

Práce na klientském programu jsou také dokončeny. Jak vidíte, Indy pro nás odvádí ohromnou práci, která umožňuje i nezkušenému programátorovi vytvořit si vlastní síťovou aplikaci.

Protokol UDP je pro přenos docela dobrý textové zprávy, to znamená, že můžete organizovat místní chaty a podobně. Rozhodl jsem se uvést příklad nejjednodušší práce s UDP v Delphi.

Návod krok za krokem:

Uvedl jsem příklad, ale promiňte, nenapsal jsem každý řádek, protože... Nevidím v tom nic složitého a každý si s tím poradí.

Vlastně, pokud něco není jasné, můžete se mě zeptat. A zde je skutečný kód:

používá
Windows, Zprávy, SysUtils, Varianty, Třídy, Grafika, Ovládací prvky, Formuláře,
Dialogy, StdCtrls, IdUDPServer, IdBaseComponent, IdComponent, IdUDPBase,
IdUDPClient, IdSocketHandle;

typ
TForm1 = class(TForm)
IdUDPClient1: TIdUDPClient;
IdUDPServer1: TIdUDPServer;
Tlačítko1: TButton;
Label1: TLabel;
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure Button1Click(Sender: TObject);
procedura IdUDPServer1UDPRead(ATvlákno: TIdUDPListenerThread; AData: TBytes;
ABinding: TIdSocketHandle);
soukromé
(soukromá prohlášení)
veřejnost
(Veřejná prohlášení)
konec;

var
Form1: TForm1;

($R *.dfm)
[b]//Postup pro odeslání zprávy
procedure TForm1.Button1Click(Sender: TObject);
začít
Snaž se
IdUDPClient1.Active:= True;
IdUDPClient1.Host:= "localhost";
IdUDPClient1.Connect;
pokud IdUDPClient1.Connected pak
začít
IdUDPClient1.Send(TimeToStr(Time));
Label1.Caption:= "ok";
konec;
IdUDPClient1.Active:= False;
Beep;Beep;Beep;
až na
MessageDlg("Něco se pokazilo =(", mtError, , 0);
konec;
konec;
[b]
//Zapnuto vypnuto. UDP server při spouštění a zavírání formuláře
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
začít
IdUDPServer1.Active:= False;
konec;

procedure TForm1.FormCreate(Sender: TObject);
začít
IdUDPServer1.Active:= True;
konec;

[b]//Procedura reakce serveru při příjmu dat
procedure TForm1.IdUDPServer1UDPRead(ATvlákno: TIdUDPListenerThread;
AData: TBytes; ABinding: TIdSocketHandle);
Var
i:Integer;
s:String;
začít
s:= "";
Snaž se
i:= 0;
zatímco (AData[i] 0) dělají
začít
s:= s + chr(AData[i]);
i:= i + 1;
konec;
Konečně
Label1.Caption:= s;
konec;
konec;

Serge Dosyukov Mike Pham

Tento článek ukazuje, jak vytvořit samostatnou webovou službu pomocí sady Indy a Delphi 7 a jak používat sadu Indy k podpoře webových služeb založených na SOAP v Delphi 7. Za dodatečné informace Informace o vytváření webových služeb naleznete ve vynikajícím článku Nicka Hodgese na webu komunity Borland: Shakespeare on the Web.

Dříve nebo později možná budete muset vytvořit server, který je samostatným HTTP serverem a podporuje webové služby. Můžete například chtít vytvořit aplikační server založený na SOAP pro vícevrstvou aplikaci vytvořenou pomocí Delphi.

Úvod

Online nápověda Delphi poskytuje vynikající sekvenční instrukce o tom, jak vytvořit webovou službu, server MIDAS (model COM, DCOM), ale prakticky neexistují žádné informace o vytvoření samostatné n-vrstvé aplikace MIDAS založené na protokolu SOAP.

Dříve publikoval Dave Nottage. Tento článek popsal myšlenku, jak vytvořit webovou službu v Delphi 6 s podporou SOAP a schopností publikovat rozhraní SOAP Datamodulu, to znamená, že vám tento článek umožnil naučit se, jak vytvořit vlastní n-vrstvu. systémy MIDAS.

Borland Delphi 7 a nová sada Indy mají vestavěnou podporu pro tuto funkci.

Navzdory vestavěné podpoře však tato funkce není zdokumentována.

Nedávné příspěvky na síťové konferenci Borland a prohledávání webu pomocí serveru Google umožnily autorům vyvinout způsob, jak převést existující kód z Delphi 6 do Delphi 7. Ale všechno má svůj čas.

hlavní myšlenka

Tento článek je prvním dílem třídílného seriálu. Popisuje hlavní ustanovení. Druhá a třetí část budou věnovány některým problémům a způsobům jejich řešení. Začněme popisovat hlavní myšlenku.

  • být samostatným HTTP serverem;
  • použít Indy jako platformu;
  • podpora publikování prostřednictvím protokolu SOAP;
  • být schopen publikovat SOAP DataModules, což by vám umožnilo vytvořit váš vlastní n-tier server založený na SOAP/HTML.

HTTP server a SOAP

Mnoho lidí zná Indy a již dříve používalo komponenty THTTPServeru. Je snadné umístit tuto komponentu na formulář žádosti, ale jak zajistíte, aby podporovala SOAP? V adresáři "C:Program FilesBorlandDelphi7SourceIndy" naleznete soubor IdHTTPWebBrokerBridge.pas. To je přesně to, co potřebujete.

Tento soubor není součástí spustitelného souboru Indy, takže jej musíte zahrnout do svého aktuálního projektu jako standardní soubor projektu. (Ke kompilaci projektu budete také potřebovat soubor IdCompilerDefines.inc.) Tyto soubory je nutné zkopírovat do aktuálního adresáře projektu. Ke zvýšení rychlosti mohou být nutné změny kódu, proto je nejlepší uchovávat tyto soubory odděleně od distribuce Indy.

Následuje popis implementace náhradní komponenty z THTTPServeru, rozšířené o podporu paketů SOAP, nazvané TIdHTTPWebBrokerBridge. Tato konstrukce je třída, která dědí z TCustomHTTPServer a podporuje základní vazbu požadavku.

Protože tato třída není přístupná z palety, budete ji muset při provádění kódu definovat jako běžný objekt.

Tento objekt lze použít úplně stejným způsobem jako běžný THTTPServer, s výjimkou těch dalších vlastností, které umožňují provoz se SOAP.
Nejprve se však podívejme na přípravu potřebného kódu.

WebBroker a Indy

Pro ty, kteří již dříve vytvořili webové služby, víte, že je používáte WebBroker. Delphi 7, stejně jako Delphi 6, používá k podpoře SOAP architekturu WebBroker.

Proto je třeba vytvořit modul TWebModule a umístěte do něj následující tři komponenty: THTTPSoapDispatcher, THTTPSoapPascalInvoker a TWSDLHTMLPublish. Všechny jsou dostupné na záložce WebServices palety komponent. Po propojení SOAPDispatcher s SOAPPascalInvoker je formulář žádosti připraven. Konečný výsledek by měl být něco jako to, co je znázorněno na následujícím obrázku:

(modul uWebModule.pas)

Nejlepší je nechat vše tak, jak je, protože pro tento formulář není třeba měnit ani spouštět žádný vlastní kód.

WebModule a Indy

Pojďme k další části kódu potřebného k implementaci HTTP serveru.

Jak můžete vidět, TIdHTTPWebBrokerBridge má metodu RegisterWebModuleClass, která vám umožňuje zaregistrovat svůj vlastní modul WebModule a zpřístupnit jej serveru.

Po vytvoření objektu serveru fServer tedy stačí zavolat třídu fServer.RegisterWebModuleClass (TwmSOAPIndy).

Poznámka. V normální implementaci TIdHTTPWebBrokerBridge bude objekt TwmSOAPIndy vytvořen pokaždé, když je přijat požadavek. To samozřejmě není nutné. Třídu lze tedy upravit tak, aby poskytovala trvalé vytvoření tohoto objektu tak dlouho, dokud objekt Server existuje. Další informace naleznete v dokumentaci implementace třídy.

Je server připraven?

Komponenty Indy používané v Delphi 6.

Kromě základních internetových služeb a protokolů existuje celá řada doplňkových služeb, jejichž možnosti často využívají internetoví vývojáři. Možnost zobrazení informací pomocí prohlížeče navíc není pro internetové aplikace vždy přijatelným řešením. V tomto případě je rozumné využít pro výměnu dat internetovou infrastrukturu a poskytovat zobrazení informací prostřednictvím složitějších klientských aplikací vyvinutých např. v Delphi.

Řekněme, že potřebujete implementovat specializovanou serverovou logiku, která není součástí standardních webových serverů. K vyřešení této třídy problémů obsahuje Delphi knihovnu Internet Direct (Indy) od Nevrona Designs (http://www.nevrona.com/Indy/). Tato knihovna, vyvinutá speciálně pro Borland Delphi, má již osm verzí, z nichž nejnovější je součástí nová verze Delphi. Sada komponent je rozdělena do tří skupin: klient (Indy Client), server (Indy Servers) a pomocný (Indy Misc).

Indy klienti a Indy servery

Většina Indy komponenty Klient a Indy servery jsou páry odpovídající klientským a serverovým částem protokolů a služeb (s výjimkou jednotlivých, převážně serverových komponent, jako jsou TunnelMaster a TunnelSlave), a umožňují použití protokolů, jako jsou TCP/IP, UDP, NNTP, SMTP, FTP, HTTP, stejně jako ECHO, FINGER, WHOIS atd. služby.

Komponenty klienta Indy jsou zapsány pomocí soketů. Soket na straně klienta vyžaduje připojení k serveru. Pokud je spojení navázáno, klient a server si mohou začít vyměňovat zprávy. Tyto zprávy jsou různé povahy, ale obvykle k výměně dochází pomocí specifického protokolu (například HTTP)

TIdTCPClient a TIdTCPServer

Tyto komponenty se používají k podpoře jednoho z hlavních síťových protokolů - TCP (Transmission Control Protocol) a jsou také základními třídami pro komponenty TIdSMTP a TIdFTP. Třída TIdTCPServer má vlastnost ThreadMgr, která má výchozí hodnotu nula. Pokud je ThreadMgr nula, když je povolen TIdTCPServer, bude implicitně vytvořena třída TIdThreadMgrDeafault. Jinak se použije nainstalovaný správce procesů.

TIdUDPClient a TIdUDPServer

Tyto komponenty slouží k podpoře síťový protokol UDP (User Datagram Protocol) a jsou také základní třídy pro řadu dalších komponent Indy.

TIdChargenServer

Komponenta se používá ke generování náhodných symbolů, obvykle pro účely testování.

TIdDayTime a TIdDayTimeServer

Komponenty slouží k poskytování časové služby. Klient požádá a server oznámí aktuální datum a čas.

TIdDNSResolver

Jedná se o klientskou komponentu, která obsluhuje požadavky ze serveru DNS (Domain Name Service). Dotazy serveru DNS jsou navrženy tak, aby nahradily název počítače jeho IP adresou. TIdDNSResolver je potomkem třídy TIdUDPClient.

TidDICTServer

Komponenta serveru, která podporuje Dictionary Server Protocol (DICT), slovník na straně serveru založený na protokolu TCP, který umožňuje klientovi přístup ke slovníku přirozeného jazyka.

Server TidDISCARD

Komponenta serveru, která podporuje server záznamů. Nahrávky lze použít jako nástroj pro ladění a měření. Záznamová služba jednoduše předá jakákoli data tomu, kdo je ochoten je přijmout.

TI dEcho a TI dECHOServer

Komponenty jsou navrženy tak, aby poskytovaly službu odezvy, která se obvykle používá ke kontrole stavu sítě. Klient odešle textovou zprávu na server, server vrátí zprávu klientovi. Pokud je zpráva zkomolená, síť nefunguje správně.

TIdFinger a TIdFingerServer

Komponenty jsou navrženy tak, aby poskytovaly protokol, který umožňuje uživateli dotazovat se na data týkající se přítomnosti jiných uživatelů v systému. Některé servery takové požadavky klientů zpracovávají. Použití této dvojice komponent vám umožní obsluhovat požadavky klientů, které určují přítomnost dalších uživatelů v systému.

Komponenta obsahuje plnou podporu pro protokol přenosu souborů - FTP (File Transfer Protocol). Podporován je pasivní i aktivní přenos dat a také operace jako GET a PUT, mazání adresářů, získávání kvót, velikosti souborů a adresářů. TI dFTP používá k provozu třídu TIdSimpleServer. Když probíhá přenos souborů FTP, otevře se sekundární připojení TCP pro přenos dat a po přenosu dat se ukončí. Toto spojení se nazývá „datové spojení“, jedinečné pro každý přenášený soubor.

TIdGopher a TIdGopherServer

Tyto komponenty jsou navrženy tak, aby poskytovaly síťový protokol, který byl nahrazen Nedávno z WWW ( Celosvětově Web) HTTP protokol. Server, který implementuje tento protokol, poskytuje hierarchický systém podpory distribuovaného toku dokumentů. Příklad použití této dvojice komponent umístěných v adresáři demosindyGopherClient a demosindy GopherServer ukazuje, jak pomocí tohoto protokolu můžete v místní síti poskytovat informace o souborech umístěných na vašem počítači, včetně uzavřených.

TIdHostNameServer

Komponenta serveru určená k předávání názvu místního serveru klientům.

TIdHTTP a TIdHTTPServer

Komponenty slouží k poskytování síťového protokolu HTTP (podporovány jsou verze 1.0 a 1.1, včetně operací GET, POST a HEAD). Kromě toho je poskytována podpora pro ověřování a používání proxy serverů. Serverová komponenta se používá k poskytování služeb jinému webovému serveru, který podporuje daný protokol. TIdHTTPServer usnadňuje implementaci funkcí, jako jsou soubory cookie, správa stavu atd.

TIdIcmpClient

Klientská komponenta navržená tak, aby poskytovala protokol ICMP (Internet Control Message Protocol), který se používá k provádění operací ping a trasování sítě.

Klientská komponenta navržená tak, aby poskytovala Post Office Protocol (POP), včetně podpory kódování a dekódování MIME a vícebajtového přenosu znaků.

Server TIDIMAP4

Serverová komponenta navržená pro podporu operací IMAP (Internet Message Access Protocol) na serveru. Protokol umožňuje vyhledávat zprávy E-mailem na serveru. Rozdíl mezi protokoly IMAP a POP je v tom, že protokol POP vyžaduje přídavná paměť k ukládání dat a protokol IMAP přistupuje k serveru místo ke klientskému počítači. IMAP4 byl vytvořen jako náhrada POP3, ale POP3 zůstává dodnes široce používaným standardem.

TidIRCServer

Komponenta serveru navržená pro podporu nejběžněji používaných servisních operací na internetu, běžně nazývaných chat. Komponenta poskytuje základní stavební bloky pro server IRC (Internet Relay Chat).

TIdMappedPortTCP

Serverová komponenta určená k vytváření mapovaných portů, které se často používají v proxy serverech. Metody této komponenty umožňují mapovat jeden port na druhý. Například port 80 by mohl být mapován na port 3000 a všechny požadavky na první port (port 80) by byly předány na druhý port (port 3000).

TIdNNTP a TIdNNTPServer

Tyto součásti jsou vyžadovány pro podporu protokolu NNTP (Network News Transfer Protocol) používaného v diskusních službách. Klientská komponenta zahrnuje podporu pro kódování a dekódování MIME, stejně jako podporu pro vícebajtové znaky a alternativní kódování. Serverová komponenta umožňuje vytvářet diskusní servery. Je důležité poznamenat, že TIdNNTPServer není plnohodnotný zpravodajský server, ale komponenta, která poskytuje základní funkce pro takový server.

TIdQOTD a TIdQOTDServer

Komponenty se používají k poskytování služby Quote of the Day. Klientská komponenta se připojí k instanci komponenty serveru, aby získala denní nabídku. Každá instance serveru obsahuje jedinečnou citační databázi.

Klientská komponenta navržená pro použití v aplikacích SMTP (Simple Mail Transfer Protocol), poskytující podporu pro ověřování, kódování a dekódování MIME a podporu vícebajtových znaků.

Klientská komponenta určená k poskytování SNTP (Simple Network Time Protocol) – časové služby. Lze použít k připojení k libovolné časové službě k určení aktuální termíny a čas.

TIdSimpleServer

Serverová komponenta, která poskytuje odlehčený TCP server. Umožňuje organizovat spojení typu point-to-point. Používá se k vytváření serverů s jedním uživatelem, to znamená, že může obsluhovat pouze jedno připojení najednou. Na rozdíl od komponenty TIdTCPServer nevytváří sekundární procesy při čekání na požadavky od klientů a při zpracování těchto požadavků. Jinými slovy, pokud server obsluhuje požadavek od klienta a v tu chvíli jej kontaktuje jiný klient, aby se připojil, bude zablokován až do konce zpracování prvního požadavku.

TIdTelnet a TIdTelnetServer

Klientská komponenta se používá k organizaci vzdálených relací na jiném počítači, včetně vyjednávání konzoly a ověřování. Komunikační protokol předpokládá přítomnost osoby interaktivně interagující se serverem. Klientská komponenta nemá podporu zobrazení ani emulaci terminálu, ale jednoduše poskytuje připojení k serverové části. Typicky se serverový protokol TIdTelnetServer používá k organizaci vzdálených databází s textovým rozhraním pro interaktivní interakci s klienty.

TIdTime a TIdTimeServer

Klientská komponenta je alternativou ke komponentě TIdSNTP pro určování času. Je důležité si uvědomit, že formáty těchto dvou protokolů se liší. TIdTime je založen na formátu RFC 868 (vrací čas v interním standardu UNIX OS, provádí všechny potřebné konverze). Serverová komponenta funguje podobně jako DayTime server. Lze použít k implementaci časové služby na místní počítač. Není vyžadován žádný další kód, stačí vytvořit instanci TIdTimeServer, která vrátí čas vnitřních hodin serverového počítače.

TIdTrivialFTP a TIdTrivialFTPServer

Tyto komponenty jsou nezbytné pro organizaci jednoduchého protokolu pro přenos souborů. Klientská komponenta tohoto protokolu se používá k připojení k instanci odpovídající serverové komponenty. Protokol je určen pro privátní, odlehčené, lokální případy přenosu souborů, například v lokálních sítích nebo pro nahrání (nahrání) směrovacích tabulek do routerů. Vzhledem k oslabeným vlastnostem tohoto protokolu se jeho použití nedoporučuje při použití autentizačních algoritmů nebo jiných bezpečnostních mechanismů. Hlavním účelem tohoto protokolu je přenos souborů do hardwarového zařízení za účelem jeho úpravy.

TIdTunnelMaster a TIdTunnelSlave

Komponenty tunelu serveru se používají v proxy serverech k organizaci více logických připojení přes jeden fyzický (tunel). Tyto třídy lze použít k různým účelům, například k uspořádání tajného spojení přes netajné kanály.

TIdWhois a TIdWhoIsServer

Tato klientská komponenta se připojuje k libovolnému standardnímu serveru Whois a umožňuje vám získávat informace o doménách. Serverová komponenta poskytuje základní funkce NIC serveru.

Indy Různé

Stránka palety Indy Miscellaneous Components obsahuje BASE64, UUE, Quoted Printable a další běžné e-mailové komunikační formáty, kodéry (MD2, MD4 a MD5) pro kryptografické standardy používané k ukládání hesel a elektronické podpisy v nevratné (těžko dešifrovatelné) podobě, stejně jako mnoho dalších užitečných komponent a utilit často používaných při vývoji internetových aplikací.

TIdAntiFreeze

Vzhledem k blokově založeným algoritmům komponent Indy se často zdá, že se aplikace zasekne, zatímco připojení funguje. Chcete-li eliminovat použití sekundárních procesů (vlákna) při organizaci komunikace, aby se zabránilo zamrznutí aplikace, stačí umístit zadanou komponentu na formulář.

Komponenta funguje tak, že analyzuje požadavky ze zásobníku protokolu TCP/IP a během prodlevy, kdy jsou externí spojení blokována, odesílá zprávy aplikaci, což vytváří iluzi běžícího kódu. Protože komponenta ovlivňuje blokovaná připojení pouze pro hlavní proces, není použití TIdAntiFreeze v sekundárních procesech aplikace vyžadováno. Mějte na paměti, že komponenta TIdAntiFreeze zpomaluje připojení, protože hlavní proces je pravidelně přerušován kvůli zpracování zpráv. Z toho vyplývá, že je třeba dbát na to, aby vyvíjená aplikace nestrávila příliš mnoho času zpracováním zpráv, včetně OnClick, OnPaint, OnResize atd. Do jisté míry to lze ovládat prostřednictvím vlastností třídy TIdAntiFreeze. Použití této komponenty není povinné, ale umožňuje vyřešit problém synchronizace spojení s vizuálním rozhraním aplikace.

TIdDateTimeStamp

Třída pro provádění matematiky data a času související se skutečností, že internetové protokoly používají různé formáty data a času; klienti a servery se navíc mohou nacházet v různých časových pásmech.

TIDIPWatch

Je to komponenta založená na časovači, která neustále monitoruje změny IP adresy počítače. Události součásti nastanou, když je zjištěna změna. Tato komponenta se obvykle používá ke zjištění, zda je počítač připojen k internetu nebo jiné síti. Změna adresy IP v této situaci může nastat v důsledku přidělení adresy IP serverem DHCP (Dynamic Host Configuration Protocol) při připojování k nové síti.

TIdLogDebug

Účelem této komponenty je zachytit události jakékoli klientské nebo serverové komponenty a umístit záznam o události zadaný soubor. Tato komponenta je velmi užitečná pro ladění komponent Indy.

TIdMessage

Komponenta se používá v kombinaci s dalšími komponentami ke správnému dešifrování nebo kódování zpráv. Mohou to být komponenty POP, SMTP a NNTP. Třída podporuje šifrování a dešifrování MIME, vícebajtové znaky a kódování ISO.

TIdNetworkCalculator

Jedna z mála komponent Indy, kterou lze použít při vytváření aplikací. Síťovou kalkulačku lze použít k provádění výpočtů IP adres, včetně síťových masek, podsítí, tříd sítě atd.

TIdThreadMgrVýchozí

Komponenta standardně poskytuje řízení sekundárních procesů. Vytvoří se, když žádná komponenta Indy, která podporuje správu procesů, nemá definovanou instanci třídy TIdThreadManager. Komponenta poskytuje pouze základní schopnosti pro správu sekundárních procesů: jejich vytváření a ničení na vyžádání.

TIdThreadMgrPool

Pokročilejší komponenta správy procesů než TIdThreadMgrDefault, protože procesy spíše slučuje, než aby je na požádání vytvářela nebo ničila.

TIdVCard

VCard je elektronický ekvivalent vizitky a může obsahovat osobní údaje majitele a grafická data.

TIdIMFDecoder

Navrženo pro dekódování internetových zpráv. Je to potomek třídy TIdCoder, stejně jako všechny ostatní komponenty kodéru. Třída TIdCoder se dekóduje podle standardu ARPA internetového formátu textových zpráv RFS-822, navrženého v srpnu 1982, a standardu zpráv USENET RFC 1036, navrženého v prosinci 1987.

Komponenta rozšiřuje třídu TIdCoder tak, aby umožňovala detekci formátu RFS-822 podle kontextu záhlaví, poskytuje režim dešifrování při příjmu a šifrování a dešifrování MIME. Komponenta TIdIMFDecoder se používá ve třídě TIdMessageClient k dekódování přijatých a vysílaných zpráv.

TIdQuotedPrintableEncoder

QuotedPrintableEncoder umožňuje dešifrovat text v určeném formátu. Může sloužit jako samostatná součást se specifikovaným typem kódování, což umožňuje přenos zpráv obsahujících nový typ kódování.

Kódovač TIDBase64

Implementuje další šifrovací algoritmus, který umožňuje přenášet netisknutelné znaky.

TIdUUEncoder

Implementuje jeden z prvních šifrovacích algoritmů, kódování UU. Někdy se používá při odesílání článků do zpravodajské služby.

TIdXXEncoder

Tato metoda šifrování pravděpodobně nebude nikdy použita. V podstatě se jedná o stejné kódování UU, ale s jinou šifrovací tabulkou.

TIDCoderMD2

Komponenty s různými typy šifrovacího algoritmu MD (Message Digest). Všechny jsou založené na náhodném pořadí, jsou jednosměrné a nemají žádné dešifrovací algoritmy.

Komponenty protokolových klientů a serverů lze použít k vývoji serverových a klientských internetových aplikací společně se základními (ClientSocket, ServerSocket) nebo místo nich a dalšími komponentami z palety Internet a Fastnet. Komponenty Indy nepoužívají architekturu WebBroker a implementují nízkoúrovňovou podporu internetových protokolů a služeb přímo ve svém zdrojovém kódu ( zdrojové kódy jsou připojeny).

TIdConnectionInterceptOpenSSL a TIdServerInterceptOpenSSL

Protokol SSL - Secure Sockets Layer, který zajišťuje utajení a spolehlivost komunikace mezi dvěma aplikacemi, má dvě vrstvy. Na nízké úrovni vícevrstvého transportního protokolu (jako je TCP) je SSL záznamový protokol a používá se k zapouzdření různých protokolů vyšší úrovně. Výhodou SSL je, že jde o nezávislý aplikační protokol, ale nad rámec SSL lze použít i protokol vyšší úrovně.

SSL poskytuje zabezpečení komunikace, které má tři hlavní funkce: poskytování důvěrného připojení; šifrování s veřejný klíč(slouží k potvrzení pravosti adresáta); podpora spolehlivosti přenosu dat.

  • K šifrování dat se používá symetrická kryptografie (např. DES, RC4 atd.).
  • Digitální podpis je poskytován pomocí asymetrického šifrování veřejným klíčem (například RSA, DSS atd.).
  • Spolehlivost komunikace, transport zpráv zahrnuje kontrolu integrity zprávy pomocí korekčních kódů MAC, bezpečných hashovacích funkcí (např. SHA, MD5 atd.) pomocí výpočtů MAC.

V kombinaci s HTTP a ověřováním serveru poskytuje SSL potřebné funkcešifrování a dále udržuje navázané spojení, dvojitou kontrolu pravosti webového serveru atd. Je důležité pochopit, že SSL chrání pouze komunikaci během přenosu dat a nenahrazuje jiné bezpečnostní mechanismy.

Komponenty TIdConnectionInterceptOpenSSL a TIdServerInterceptOpenSSL poskytují připojení na straně klienta i na straně serveru pomocí protokolu SSL. Je třeba poznamenat, že komponenty TIdConnectionInterceptOpenSSL a TIdServerInterceptOpenSSL jsou dostupné pouze v Delphi 6, nikoli v Kylixu. To je způsobeno složitostí protokolu, který je v případě implementace Windows založen na funkcích operačního systému.

Příklady použití komponent Indy lze nalézt v adresářích /Delphi6/Demos/Indy. Celkem obsahuje knihovna Indy ve verzi 8.0 69 komponent. Uvádí se, že ve verzi 9.0 bude zadaná knihovna obsahovat 86 komponent. Všechny komponenty jsou sjednoceny a obsaženy v Delphi 6 i Kylixu, což umožňuje jejich použití pro vývoj multiplatformních aplikací. Všechny komponenty Indy podporují multithreading.

Komponenty Indy implementují téměř všechny funkce nalezené v komponentách Internet a Fastnet, jak je jasně uvedeno v tabulce.

Fastn a komponenty Indy komponenty Účel komponent
1 TserverSocket, TClientSocket TIdTCPserverSocket, TIdTCPClientSocket Interakce mezi dvěma počítači (klient a server) pomocí protokolu TCP/IP
2 TNMDayTime TIdDayTime, TIdDayTimeServer Dotaz na server na aktuální čas
3 TNMEcho TIdEcho, TIdEchoServer Používá se ke komunikaci s odpovědním serverem
4 TNMFinger TIdFinger, TIdFingerServer Slouží k získání informací o uživateli z internetového vyhledávacího serveru
5 TNMFTP TIdFTP, TIdTrivialFTP, TIdTrivialFTPServer Zajistěte přenos souborů pomocí protokolu FTP
6 TNMHTTP TIdHTTP, TIdHTTPServer Pro výměnu dat použijte protokol HTTP
7 TNMMsgServ, TNMMsg Používá se k přenosu jednoduchých textových zpráv z klienta na server
8 TNMNNTP TIdNNTP, TIdNNTPServer Podporuje výměnu dat s news serverem
9 TNMPOP3 TIDPOP3 Používá se pro příjem e-mailů z poštovního serveru pomocí protokolu POP3
10 TNMSMTP TIdSMTP Používá se k odesílání e-mailů přes internetový poštovní server
11 TNMStrm, TNMStrmServ Přenáší binární data zapsaná do proudu pomocí protokolu TCP/IP
12 TNMUDP TIdUDP, TIdUDPServer Přenos dat pomocí protokolu UDP
13 TpowerSock, TNMGeneralServer Třídy zapouzdřené komponentami, které jsou základem pro psaní vašich vlastních klientů (Powersock) a serverů (NMGeneralServer)
14 Procesor TNMUU TIdUUEncoder, TIdUUDecoder Proveďte překódování binární soubory do formátu MIME nebo UUENCODE
15 TNMURL Převede řetězce na HTML formát a provede zpětné překódování

Výjimkou jsou třídy jako TNMMsgServ, TNMMsg, TNMStrm, TNMStrmServ, TpowerSock, TNMGeneralServer, TNMURL, které buď implementují zastaralé protokoly, nebo mají funkcionalitu implementovanou ve velké skupině alternativních tříd.

Na rozdíl od svých předchůdců – komponent Internet a Fastnet, však Indy obsahuje bohatší serverové komponenty a komponenty pro překódování a šifrování dat a také podporu autentizace (paleta Indy Misc). Jak je patrné z výše uvedené tabulky, hlavní protokoly a služby jsou poskytovány nejen klientskými, ale také serverovými komponentami. Jedná se o časové služby, služby odezvy, získávání uživatelských informací, dále protokoly HTTP, NNTP, UDP a dokonce i nejjednodušší verzi FTP.

Některé příklady použití komponent Indy

V komponentách Indy obsažených v Delphi je IP adresa definována ve vlastnosti Host, obvykle pouze v klientských aplikacích. Komponenty hostované na serveru mají metody, které vám umožňují spustit nebo zastavit dotazování odpovídajícího portu – například změna vlastnosti Active komponenty IdTCPServer spustí nebo zastaví dotazování odpovídajícího portu. Jakmile je navázáno spojení mezi klientem a serverem, může začít přenos dat.

Komponenty Indy kladou velký důraz na bezpečnost a spolehlivost při práci s daty. Například komponenta IdTCPClient má metody Connect a Disconnect. Pomocí programovací techniky, jako je níže uvedený kód, ze strany klienta:

S TCPClient začněte Connect; zkuste lstMain.Items.Add(ReadLn); nakonec Odpojit; konec; konec;

a pomocí vlastnosti Connection předané jako parametr instanci AThread třídy TIdPeerThread ze strany serveru:

S AThread.Connection začněte WriteLn("Dobrý den ze serveru Basic Indy Server."); Odpojit; konec;

můžete počítat buď s normálním provedením připojení, nebo se správným zpracováním chyb.

Všimněte si metod ReadLn a WriteLn odpovídajících tříd – podobají se standardním I/O příkazům Pascalu. To je daň za unixovou programovací techniku, kde se většina systémových operací provádí čtením a zápisem do odpovídajících souborů.

Stejně jako komponenty Fastnet mají třídy komponent Indy události, které lze použít k zajištění správy událostí. Můžete například zařídit, aby se zpráva zobrazila ve formuláři při připojení ke klientovi:

Procedure TForm1.IdECHOServer1Connect(AThread: TIdPeerThread); begin lblStatus.caption:= "[ Obsluhující klient ]"; konec;

Indy poskytuje komponenty, které implementují protokoly s klientskými a serverovými částmi, které jsou jedinečné pro tuto knihovnu. Komponenty TIdGopherServer a TIdGopher díky metodám GetExtendedMenu, GetFile, GetMenu, GetTextFile na straně klienta a ReturnGopherItem, SendDirectoryEntry na straně serveru pomáhají prohlížet soubory. různé typy, včetně těch, které jsou označeny jako skryté, a také adresářů na vzdálený počítač(podobné tomu, co dělá příkaz dir *.* operační systém MS-DOS).

Pomocí komponent IdSMTP a IdMessage můžete snadno vytvořit vlastní webovou aplikaci, která umí odesílat poštu pomocí protokolu SMTP.

V tomto případě je třída IdMessage (jedna z 23 komponent na stránce Indy Misc) zodpovědná za generování zprávy, která vyplývá z jejího názvu, a IdSMTP je za organizaci spojení s poštovním serverem.

Technologie používaná v Indy využívá zamykání operací čtení a zápisu. Jakákoli operace Connect použitá v Indy čeká na dokončení připojení. Při práci s klientskými komponentami Indy obvykle musíte provést následující:

  • požádat o připojení k serveru;
  • zadávat požadavky na čtení a zápis na server (v závislosti na typu serveru se krok provede jednou nebo se mnohokrát opakuje);
  • ukončete připojení k serveru a odpojte se.

Komponenty Indy jsou navrženy tak, aby poskytovaly ultra vysokou úroveň abstrakce. Složitosti a podrobnosti zásobníku TCP/IP jsou před programátorem skryty, aby se mohl soustředit na daný úkol.

Následující malý příklad ukazuje typickou relaci client bean:

S IndyClient začněte Host:= "zip.pbe.com"; // Hostitel, který má volat Port:= 6000; // Port pro volání serveru na Connect; zkuste // Váš kód se dostane sem konečně Disconnect; konec; konec;

V tomto příkladu, i když není navázáno připojení k serveru, bude připojení řádně ukončeno kvůli použití příkazu try-finally.

Serverové komponenty Indy popisují různé modely serverů, které lze použít v závislosti na vašich potřebách a protokolu, který používáte.

TIdTCPServer je nejběžněji používaná serverová komponenta, která vytváří sekundární proces nezávislý na hlavním aplikačním procesu. Vytvořený proces čeká na příchozí požadavky od potenciální klienty. Pro každého klienta, na jehož požadavek reaguje, je vytvořen samostatný sekundární proces. Události, ke kterým dojde během procesu údržby, souvisí s kontextem odpovídajících procesů.

Jinými slovy, pro každé připojení klienta používá třída TIdTCPServer jedinečné sekundární vlákno voláním obslužné rutiny události OnExecute daného vlákna. Formálním parametrem metody OnExecute je odkaz na instanci třídy Athread odpovídající vytvořenému vláknu. Vlastnost Connection této třídy je odkazem na třídu TIdTCPConnection, jejíž instance je vytvořena pro zpracování požadavku klienta. TIdTCPConnection podporuje čtení a zápis přes připojení, stejně jako vytvoření a ukončení komunikační relace.

Protokol UDP funguje bez předchozího navázání spojení se serverem (každý odeslaný paket je nezávislou sadou dat a není součástí větší relace nebo spojení). Zatímco TIdTCPServer vytváří samostatná vlákna pro každé připojení, TIdUDPServer používá hlavní vlákno nebo jediné sekundární vlákno, které zpracovává všechny požadavky protokolu UDP. Když je TIdUDPServer aktivní, vytvoří se vlákno, které naslouchá příchozím paketům UDP. Pro každý přijatý paket je vyvolána událost OnUDPRead buď v hlavním vláknu, nebo v kontextu naslouchajícího vlákna, v závislosti na hodnotě vlastnosti ThreadedEvent. Když je ThreadedEvent vyhodnocena jako False, dojde k události v hlavním vláknu, jinak se vyskytuje v naslouchajícím vláknu. Během zpracovávání události jsou ostatní operace serveru blokovány. Proto je důležité zajistit, aby procedury OnUDPRead běžely co nejrychleji.

Pokud potřebujete vytvořit novou klientskou aplikaci pro existující server pomocí existujícího protokolu, vaším úkolem je pouze vyvinout a ladit klientskou aplikaci. Když však musíte vyvinout jak klienta, tak serverová aplikace Ať už používáme stávající nebo nový protokol, čelíme klasickému problému „kuře a vejce“. Kde začít s programováním - z klienta nebo ze serveru?

Je zřejmé, že klient i server musí být nakonec vytvořeny. U mnoha aplikací, zejména těch, které používají textový protokol (jako je HTTP), je snazší začít sestavovat aplikaci návrhem serveru. A pro ladění existuje pohodlný klient, který již existuje. Toto je aplikace konzoly Telnet, která je k dispozici v systémech Windows i UNIX.

Pokud napíšete konzolu příkaz telnet 127.0.0.1 80 s IP adresou místního počítače a číslem portu 80, který je standardně používán webovými servery, pak aplikace odpoví textem znázorněným na Obr. 6, v případě OS Windows 2000 a IIS 5.0.

K vytvoření nejjednoduššího serveru pomocí komponent Indy potřebujete:

Pokud potřebujete navrhnout server, který bude nejen správně informovat své klienty o ztrátě spojení, ale také jim poskytne informace o chybových situacích, ke kterým došlo, použijte místo try-finally příkaz try-except - např. zobrazeno v následujícím příkladu:

Procedure TDataModule1.IdTCPServer1Execute(AThread: IdPeerThread); var s: řetězec; začněte s AThread.Connection zkuste zkusit s:= ReadLn; // Zde proveďte úlohu serveru // pokud není vyvolána žádná výjimka, // zapište odpověď serveru WriteLn(s); kromě e: Výjimka do begin WriteLn(e.Message); end; //on end; //zkus kromě nakonec Disconnect; end; end;

Tento malý příklad ukazuje kroky k vytvoření jednoduchého textového serveru a také způsob jeho ladění.

Výše popsaný server je typickým příkladem organizace moderní distribuované výpočetní techniky.

Funkce vytváření vícevrstvých aplikací

V poslední době se k uspokojení požadavků klientů stále více používá více serverů. Server tohoto typu poté, co přijal požadavek klienta a částečně jej připravil k dalšímu zpracování, kontaktuje jiný server a odešle mu transformovaný požadavek nebo požadavky. Server druhé vrstvy může zase komunikovat s jinými servery. Můžeme tedy mluvit o vícevrstvé serverové architektuře.

Dále vytvoříme datový server, jehož účelem je vracet data z databáze. Tento server však nečte ani nezapisuje soubory databáze přímo. Místo toho komunikuje s databázovým serverem při hledání dat požadovaných klientem.

Začneme tedy vyvíjet aplikaci s třívrstvou architekturou. Chcete-li vytvořit databázový server pomocí komponent Indy, potřebujete:

  1. Vytvořte nový projekt.
  2. Položit hlavní formulář instance projektu komponenty TIdTCPServer z palety Indy Servers.
  3. Nastavte vlastnost DefaultPort instance třídy TIdTCPServer1 na 6001 (doporučuje se přiřazovat velké hodnoty, abyste se vyhnuli duplikaci čísel portů v různých aplikacích) a nastavte vlastnost Active na true.
  4. Přidejte do projektu nový modul výběrem Soubor | Nový | Data Module a umístěte na něj instance komponent SQLConnection a SQLDataSet ze záložky dbExpress na paletě komponent.
  5. Nastavte vlastnost ConnectionName třídy SQLConnection na IBLocal a LoginPrompt na hodnotu False. Pokud jste nenakonfigurovali IBLocal v databázi zaměstnanec.gdb, dokončete nejprve tento postup.

Ahoj všichni!

Při vývoji dalšího webového projektu vyvstal úkol - implementovat klientský software v Delphi, který by přenášel data na server metodou POST. Aplikace musí přenést text a odeslat soubory na webový server.

Implementace takového odesílání dat pomocí jazyků na straně serveru Vývoj webu(například PHP) je docela jednoduché, ale pokud potřebujete napsat aplikační software pro více uživatelů, který komunikuje se serverem, pak je to trochu složitější. Metoda přímého připojení k databázi a přes FTP k serveru od Delphi již není nutná, protože není bezpečný, není spolehlivý (změna hesel, dat připojení atd.) a vytváří další. problémy s kompatibilitou softwaru na straně klienta. Abych problém vyřešil, rozhodl jsem se napsat skripty (serverová část) v PHP, které budou zpracovávat příchozí požadavky POST a vrátit výsledek klientovi (aplikace Delphi). Výhodou tohoto přístupu je, že všechna připojení a zpracování dat probíhá na serveru, což je mnohem bezpečnější než přímé „spojení“.

Když jsem začal googlovat, spousta rozházených informací se vzdala, většinou na fórech, ale všechno to bylo na kousky. Jedna věc byla jistá, že bude použit Indy, a to komponenta IdHTTP s implementovanou metodou POST. Ve skutečnosti je vše jednoduché, tato metoda vezme dva parametry Url zdroje a DataStream (datový proud) a vrátí výsledek v textové podobě (může to být i HTML kód stránky). Hlavní bylo správné vytvoření DataStreamu (toku přenášených dat), ale postupem času se objevila další úskalí, a to ruské kódování (pokud by nebylo dobré). Tady začala zábava na několik hodin putování po internetu. Obecně dost řečí, přejděme k procvičování a implementaci softwaru.

Program je tedy jednoduchý. Musí odeslat data na server pomocí metody POST, data obsahují " Nadpis " (řádek), " Popis » ( víceřádkový text) A grafický soubor(jpg,png,gif-binární data). Server musí tato data přijmout, zpracovat, uložit grafický soubor na server a vrátit odpověď. Jako odpověď vrátíme Delphi do aplikace, stejný text pouze s přidanými popisky a odkazem na stažený soubor. Nic jiného.

Začněme implementací serverové části (podobně jako API webu). Otevřete libovolný textový editor(poznámkový blok) a napište do něj následující kód:

"; ) else ( echo "Titul: Chybí"."
"; ) //Zkontrolujte v příchozích datech přítomnost dat pole "content" if (!empty($_POST["content"]))( echo "Content: ".$_POST["content"]."
"; ) else ( echo "Obsah: chybí"."
"; ) //Zkontrolujte příchozí data na přítomnost připojeného souboru "soubor" if (!empty($_FILES["file"])) ( $finfo = pathinfo($_FILES["file"]["name" ]); / /získání informací o souboru (název, přípona atd.) //Zkontrolujte typ souboru v seznamu povolených typů (IMPROVIZACE:)) if (stripos("jpgpnggif",$finfo["přípona"] )==0)( echo ">>>>>>>Neplatný typ souboru<<<<<<<<"; exit; //Если не допустим тип, полностью останавливаем скрипт } $fname = "files/" . "testimgfile." . $finfo["extension"]; //формируем путь и новое имя файла move_uploaded_file($_FILES["file"]["tmp_name"],$fname);//сохраняем временный файл "tmp_name" в файл $fname echo "http://".$_SERVER["HTTP_HOST"]."/".$fname; //возвращаем полный путь к файлу } ?>

Poznámka! Při ukládání (přes poznámkový blok) musíte zadat kódování „UTF-8“, jinak budou problémy se zobrazením azbuky!

Scénář se snažil poskytnout podrobné komentáře. Zkopírujte tento skript na svůj webový server, pokud jej nemáte, můžete pro test použít můj skript, který se nachází na adrese: http://api..php

Rozvržení využívá tyto komponenty: Label, Button (2 ks), Edit (2 ks), Memo (2 ks), CheckBox, OpenDialog, IdHTTP. Zadejte následující názvy komponent (vlastnost „ název”):

  1. Upravit (název) – Jméno=název;
  2. Upravit (cesta k souboru) Jméno = imgfile;
  3. Poznámka (obsah)Jméno = obsah;
  4. Poznámka (výsledek) – Jméno = odpověď;
  5. Knoflík(…) - Jméno = chkfile;
  6. Tlačítko (POST) – Jméno = PostBut;
  7. OpenDialog (dialogové okno pro výběr souboru) – Název = PictDialog;

Nechme IdHTTP1 a CheckBox1 beze změny (unavení! :)))).

Aby nedošlo náhodou" Upravit» cesta k úpravě( imgfile), nastavte jeho vlastnost ReadOnly na True. Stejně tak v imgfile A chkfile Nastavte vlastnost Enabled na hodnotu false. Aktivujeme je pomocí CheckBoxu, tzn. Poskytneme možnost vybrat si, zda nahrát obrázek nebo ne.

Pro OpenDialog( PictDialog) musíte nastavit filtr (vlastnost Filtr) takto:

Vlastní vizuální příprava je u konce! Začněme kódovat!

V projektu vygenerujeme datový tok pomocí typu zahrnutého v Indy - TidMultiPartFormDataStream. Přestože jsme narazili na možnosti implementace pomocí TStream, práce s TidMultiPartFormDataStream – jednodušší!

Abychom tento typ zpřístupnili našemu projektu, musíme do Uses přidat následující knihovnu: IdMultipartFormData.

Pro CheckBox1 vytvořte událost OnClick (poklepáním myší na objekt) a přidejte k této události následující kód:

Procedure TForm1.CheckBox1Click(Sender: TObject); begin //aktivace nebo deaktivace prvků cesty k souboru a dialogových tlačítek imgfile.Enabled:=CheckBox1.Checked; chkfile.Enabled:=CheckBox1.Checked; konec;

Zde objekty aktivujeme imgfile Achkfile v závislosti na přítomnosti zaškrtnutí (pokud je zaškrtávací políčko zaškrtnuto, objekty se stanou aktivními).

Nyní uspořádáme výběr obrázků. Chcete-li to provést, vytvořte na tlačítku událost OnClick chkfile(také dvojitým kliknutím na objekt) a napište následující:

Procedure TForm1.chkfileClick(Sender: TObject); begin //otevřete dialog a zadejte úplnou cestu k souboru do imgfile(TEdit) if PictDialog.Execute then imgfile.Text:= PictDialog.FileName; konec;

Tato událost spustí dialog pro výběr obrázku a pokud uživatel klikne na „ OTEVŘENO“, pak bude přidána cesta k tomuto souboru imgfile.

A nyní se dostáváme ke konečnému tlačítku „POST“. Vytvořte událost OnClick pro toto tlačítko a přidejte následující kód:

Procedure TForm1.PostButClick(Sender: TObject); var dataPost:TIdMultiPartFormDataStream; begin dataPost:=TIdMultiPartFormDataStream.Create; dataPost.AddFormField("title",title.Text,"utf-8").ContentTransfer:= "8bit"; dataPost.AddFormField("content",content.Text,"utf-8").ContentTransfer:= "8bit"; if CheckBox1.Checked a (trim(imgfile.Text)="") then //kontrola, zda je soubor vybrán nebo ne begin ShowMessage("Musíte vybrat grafický soubor!"); výstup; konec; if CheckBox1.Checked then dataPost.AddFile("file",imgfile.Text,""); //přidejte pole se souborem response.Text:= StringReplace(idHTTP1.Post("http://api..php",dataPost),"
",#13#10,); datapost.Free; end;

Takže popořadě (i když jsou komentáře):

Datapost – objekt typu TIdMultiPartFormDataStream. Umožňuje vytvořit strukturu požadavku POST sestávající z polí různých typů.

dataPost . AddFormField (" titul ", titul . Text ," utf -8 "). Content Transfer := " 8 bit "; – přidá do DataPost pole s názvem „title“, hodnotu z „title.Text“, nastaví kódování přenášených dat na „utf-8“ (parametr je volitelný, ale bez jeho explicitního označení se azbuka přenáší s otazníky „?“) a velmi důležitou metodu „Přenos obsahu“. Bez této metody jsou data odesílána na server " abrakadabra" Vezměte prosím na vědomí, že název pole („název“) na odesílající straně se musí shodovat se jménem zadaným ve skriptu: $_POST["název"].

Data se přenášejí podobně jako pole „obsah“.

dataPost . Přidat soubor (" soubor ", imgfile . Text ,"") – tímto řádkem vytvoříme stream s daty ze souboru.

To je vše, data jsou vygenerována, zbývá je pouze přenést do skriptu na serveru a obdržet odpověď:

response.Text:= StringReplace(idHTTP1.Post("http://api..php",dataPost),"
",#13#10,);

protože TMemo nerozumí značce konce řádku "
", pomocí funkce " " jej nahradíme srozumitelným zalomením řádků "#13#10".

Když je vše dokončeno, vymažte paměť z objektu DataPost pomocí řádku:

datapost.Free;

I když v našem příkladu k tomu dojde automaticky na konci procedury, ale přesto...

Skutečný výsledek programu na obrazovce:

Můžeme tak na server poslat tolik dat nebo souborů, kolik chceme, zpracovat tato data na serveru a zpětně hlásit aplikaci výsledek skriptu. Může to být dokonce jen 0 nebo 1, což bude signalizovat aplikaci, aby reagovala dále.

Všechno. Hodně štěstí všem. Doufám, že informace byly užitečné a najdete pro ně využití.

Hotový příklad a skript si můžete stáhnout.

Celý kód modulu:

Jednotka PostUnit; rozhraní používá Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient IdHTTP, IdMultipartFormData, Vcl.ExtDlgs; typ TForm1 = class(TForm) IdHTTP1: TIdHTTP; název: TEdit; obsah: TMemo; PostBut: TButton; odpověď: TMemo; Label1: TLabel; Label2: TLabel; Label3: TLabel; imgfile:TEdit; chkfile: TButton; Label4: TLabel; CheckBox1: TCheckBox; PictDialog:TOpenDialog; procedure PostButClick(Sender: TObject); procedure chkfileClick(Sender: TObject); procedure CheckBox1Click(Sender: TObject); private ( Private deklarace ) public ( Public deklarace ) end; var Form1: TForm1; implementace ($R *.dfm) procedure TForm1.CheckBox1Click(Sender: TObject); begin //aktivace nebo deaktivace prvků cesty k souboru a dialogových tlačítek imgfile.Enabled:=CheckBox1.Checked; chkfile.Enabled:=CheckBox1.Checked; konec; procedure TForm1.chkfileClick(Sender: TObject); begin //otevřete dialog a zadejte úplnou cestu k souboru do imgfile(TEdit) if PictDialog.Execute then imgfile.Text:= PictDialog.FileName; konec; procedure TForm1.PostButClick(Sender: TObject); var dataPost:TIdMultiPartFormDataStream; begin dataPost:=TIdMultiPartFormDataStream.Create; dataPost.AddFormField("title",title.Text,"utf-8").ContentTransfer:= "8bit"; dataPost.AddFormField("content",content.Text,"utf-8").ContentTransfer:= "8bit"; if CheckBox1.Checked a (trim(imgfile.Text)="") then //kontrola, zda je soubor vybrán nebo ne begin ShowMessage("Musíte vybrat grafický soubor!"); výstup; konec; if CheckBox1.Checked then dataPost.AddFile("file",imgfile.Text,""); //přidejte pole se souborem response.Text:= StringReplace(idHTTP1.Post("http://api..php",dataPost),"
",#13#10,); datapost.Free; end; end.