Delphi aplikacija šalje podatke na server koristeći POST metodu (Indy). Indy komponente koje se koriste u Delphiju

Indy je prilično moćan paket komponenti koji vam omogućava razvoj različitih mrežnih aplikacija. U ovom vodiču ću vam reći kako možete kreirati klijent-server aplikacije koristeći komponente TIdTCPClient i TIdTCPServer.

Prije svega, želio bih napomenuti dvije važne prednosti ovih komponenti. Najvažniji od njih je multithreading, što znači da server kreira zasebnu nit za svakog klijenta, a to svakako utiče na performanse serverskog programa na računarima sa višejezgarnim procesorom. Druga prednost je jednostavnost upotrebe. 10-20 linija koda je dovoljno za pisanje jednostavne klijent-server aplikacije. Ovaj paket komponenti prisutan je u standardnim Delphi sklopovima.

Hajde da pišemo jednostavan program, koji vam omogućava da prenesete tekstualnu poruku sa klijenta na server. Počnimo sa kreiranjem servera.
Postavimo komponentu IdTCPServer sa kartice “Indy Servers” na obrazac. Mi ćemo izvršiti sve postavke za ovu komponentu tokom vremena izvođenja u OnCreate događaju obrasca:
IdTCPServer1.DefaultPort:= 12345;
IdTCPServer1.Active:= istina;
Ovdje je sve jednostavno - označavamo port na kojem će server raditi i aktiviramo sam server.

Za primanje podataka na serveru od klijenta postoji poseban događaj “OnExecute”. Ovaj događaj izgleda ovako:

početi
kraj;

Uredimo sadržaj događaja na sljedeći način:
procedura TForm3.IdTCPServer1Execute(AContext: TIdContext);
var
l:string; // string varijabla u koju ćemo primiti
početi
l:= AContext.Connection.IOHandler.ReadLn();
Memo1.Lines.Add(l);
kraj;

Sada, čim poruka stigne na server, upisaćemo je u varijablu stringa l i izbaciti je u tekstualno polje sa više redaka.

Ovo, nije iznenađujuće, završava stvaranje servera. Indy će učiniti ostalo za nas. Počnimo sa klijentskim programom. Povezat će se sa serverom, poslati mu poruku i prekinuti vezu sa serverom.

Kreirajmo novi projekat, postavite komponentu IdTCPClient na obrazac, koji se može naći na kartici “Indy Clients”. Također ćemo postaviti jednostavnu Edit i dugme. Kreirajmo OnClick obrađivač događaja za dugme, unutar kojeg ćemo napisati:
IdTCPClient1.Port:= 12345;
IdTCPClient1.Host:= '127.0.0.1';
IdTCPClient1.Connect;
IdTCPClient1.IOHandler.WriteLn(Edit1.Text);
IdTCPClient1.Disconnect;

Ovaj kod ne mora biti postavljen u događaj OnCreate. Ovaj kod možete postaviti bilo gdje ako želite.
U prvom redu dodjeljujemo port, a potrebno je navesti isti port koji smo naveli u serverskom programu, inače klijent jednostavno neće pronaći server. Zatim navodimo IP adresu servera. Sam server se može nalaziti u lokalna mreža, i na daljinu. U potonjem slučaju, veza će se ostvariti putem Interneta i morat ćete navesti IP adresu na Internetu.

Naveo sam adresu “127.0.0.1”, što znači da je server računar na kojem klijent radi. Ova metoda je vrlo pogodna za testiranje mrežnih aplikacija.
Zatim uspostavljamo vezu, šaljemo poruku i prekidamo vezu.Kao i sama poruka, IP adresu možete uzeti iz Edit ili iz bilo koje varijable niza.

Završen je i rad na klijentskom programu. Kao što vidite, Indy radi ogroman posao za nas, što omogućava čak i neiskusnom programeru da kreira vlastitu mrežnu aplikaciju.

UDP protokol je prilično dobar za prijenos tekstualne poruke, odnosno možete organizirati lokalne razgovore i slično. Odlučio sam dati primjer najjednostavnijeg rada sa UDP-om u Delphiju.

Korak po korak instrukcije:

Dao sam primjer, ali oprostite, nisam zapisivao svaki red, jer... Ne vidim ništa komplikovano i svako to može da shvati.

Zapravo, ako nešto nije jasno, možete mi postaviti pitanje. A evo stvarnog koda:

koristi
Windows, poruke, SysUtils, varijante, klase, grafika, kontrole, obrasci,
Dijalozi, StdCtrls, IdUDPServer, IdBaseComponent, IdComponent, IdUDPBase,
IdUDPClient, IdSocketHandle;

tip
TForm1 = klasa(TForm)
IdUDPClient1: TIdUDPClient;
IdUDPServer1: TIdUDPServer;
Button1: TButton;
Oznaka1: TLabel;
procedura FormCreate(Pošiljalac: TObject);
procedura FormClose(Pošiljalac: TObject; var Akcija: TCloseAction);
procedura Button1Click(Pošiljalac: TObject);
procedura IdUDPServer1UDPRead(AThread: TIdUDPListenerThread; AData: TBytes;
ABinding: TIdSocketHandle);
privatni
(privatne izjave)
javnosti
(Javne izjave)
kraj;

var
Form1: TForm1;

($R *.dfm)
[b]//Procedura za slanje poruke
procedura TForm1.Button1Click(Pošiljalac: TObject);
početi
probaj
IdUDPClient1.Active:= Tačno;
IdUDPClient1.Host:= "localhost";
IdUDPClient1.Connect;
ako je IdUDPClient1.Povezan tada
početi
IdUDPClient1.Send(TimeToStr(Time));
Label1.Caption:= "ok";
kraj;
IdUDPClient1.Active:= False;
Beep;Beep;Beep;
osim
MessageDlg("Nešto je pošlo po zlu =(", mtError, , 0);
kraj;
kraj;
[b]
//Uključeno isključeno. UDP server prilikom pokretanja i zatvaranja obrasca
procedura TForm1.FormClose(Pošiljalac: TObject; var Akcija: TCloseAction);
početi
IdUDPServer1.Active:= False;
kraj;

procedura TForm1.FormCreate(Pošiljalac: TObject);
početi
IdUDPServer1.Active:= Tačno;
kraj;

[b]//Procedura reakcije servera prilikom prijema podataka
procedura TForm1.IdUDPServer1UDPRead(AThread: TIdUDPListenerThread;
AD podaci: TBytes; ABinding: TIdSocketHandle);
Var
i:Integer;
s:String;
početi
s:= "";
probaj
i:= 0;
dok (AData[i] 0) radi
početi
s:= s + chr(AData[i]);
i:= i + 1;
kraj;
konačno
Label1.Caption:= s;
kraj;
kraj;

Serge Dosyukov Mike Pham

Ovaj članak vam pokazuje kako da kreirate samostalnu Web uslugu koristeći Indy kit i Delphi 7, i kako da koristite Indy komplet za podršku Delphi 7 SOAP-baziranih Web usluga. Iza Dodatne informacije Za informacije o kreiranju web usluga, pogledajte odličan članak Nicka Hodgesa na stranici Borland zajednice: Shakespeare on the Web.

Pre ili kasnije, možda ćete morati da kreirate server koji je samostalni HTTP server i koji podržava Web usluge. Na primjer, možda biste željeli kreirati SOAP-bazirani poslužitelj aplikacija za n-slojnu aplikaciju izgrađenu pomoću Delphija.

Uvod

Delphi-jeva online pomoć je odlična sekvencijalna instrukcija o tome kako kreirati web servis, MIDAS server (COM, DCOM model), ali praktično nema informacija o kreiranju samostalne n-tier MIDAS aplikacije bazirane na SOAP protokolu.

Prethodno objavio Dave Nottage. Ovaj članak opisuje ideju ​​kako kreirati web servis u Delphiju 6 sa SOAP podrškom i mogućnošću objavljivanja SOAP sučelja Datamodulea, odnosno, ovaj članak vam je omogućio da naučite kako kreirati vlastiti n-tier MIDAS sistemi.

Borlandov Delphi 7 i novi Indy kit imaju ugrađenu podršku za ovu funkcionalnost.

Međutim, uprkos ugrađenoj podršci, ova funkcija nije dokumentirana.

Nedavne objave na Borland mrežnoj konferenciji i pretraživanje interneta pomoću Google servera omogućili su autorima da razviju način za pretvaranje postojećeg koda iz Delphija 6 u Delphi 7. Ali sve ima svoje vrijeme.

glavna ideja

Ovaj članak je prvi dio serije od tri dijela. Opisuje glavne odredbe. Drugi i treći dio bit će posvećeni nekim problemima i načinima njihovog rješavanja. Počnimo s opisom glavne ideje.

  • biti samostalni HTTP server;
  • koristiti Indy kao platformu;
  • podrška za objavljivanje putem SOAP protokola;
  • biti sposoban za objavljivanje SOAP modula podataka, što bi vam omogućilo da kreirate vlastiti n-slojni server baziran na SOAP/HTML-u.

HTTP server i SOAP

Mnogi ljudi poznaju Indy i ranije su koristili THTTPServer komponente. Lako je staviti ovu komponentu na formular za prijavu, ali kako učiniti da podržava SOAP? U direktoriju "C:Program FilesBorlandDelphi7SourceIndy" možete pronaći datoteku IdHTTPWebBrokerBridge.pas. Ovo je upravo ono što vam treba.

Ova datoteka nije dio Indy izvršne datoteke, tako da je morate uključiti u svoj trenutni projekt kao standardni projektni fajl. (Za kompajliranje projekta, trebat će vam i datoteka IdCompilerDefines.inc.) Ove datoteke moraju biti kopirane u trenutni direktorij projekta. Promjene koda mogu biti potrebne za povećanje brzine, tako da je najbolje držati ove datoteke odvojeno od Indy distribucije.

Sljedeće opisuje implementaciju zamjenske komponente iz THTTPServera, proširene za podršku SOAP paketima, pod nazivom TIdHTTPWebBrokerBridge. Ova konstrukcija je klasa koja nasljeđuje od TCustomHTTPServera i podržava osnovno povezivanje zahtjeva.

Pošto ovoj klasi nije moguće pristupiti sa palete, moraćete da je definišete kao običan objekat prilikom izvršavanja vašeg koda.

Ovaj objekat se može koristiti na potpuno isti način kao i običan THTTPServer, sa izuzetkom onih dodatnih svojstava koja omogućavaju rad sa SOAP-om.
Međutim, prvo pogledajmo pripremu potrebnog koda.

WebBroker i Indy

Za one koji su ranije kreirali Web usluge, znate da ih koristite WebBroker. Delphi 7, kao i Delphi 6, koristi arhitekturu WebBroker za podršku SOAP-u.

Stoga morate kreirati modul TWebModule i u njega postavite sljedeće tri komponente: THTTPSoapDispatcher, THTTPSoapPascalInvoker i TWSDLHTMLPublish. Svi su dostupni na kartici WebServices na paleti komponenti. Nakon povezivanja SOAPDispatchera sa SOAPPascalInvokerom, obrazac za prijavu je spreman. Krajnji rezultat bi trebao izgledati otprilike ovako:

(modul uWebModule.pas)

Najbolje je ostaviti sve kako jeste, jer nema potrebe mijenjati ili izvršavati bilo koji prilagođeni kod za ovaj obrazac.

WebModule i Indy

Pređimo na drugi dio koda koji je potreban za implementaciju HTTP servera.

Kao što vidite, TIdHTTPWebBrokerBridge ima RegisterWebModuleClass metodu, koja vam omogućava da registrujete sopstveni WebModule i učinite ga dostupnim serveru.

Stoga, nakon kreiranja fServer serverskog objekta, trebate samo pozvati klasu fServer.RegisterWebModuleClass (TwmSOAPIndy).

Bilješka. U normalnoj implementaciji TIdHTTPWebBrokerBridge, objekt TwmSOAPIndy će biti kreiran svaki put kada se primi zahtjev. Očigledno to nije potrebno. Stoga se klasa može modificirati kako bi se omogućilo trajno kreiranje ovog objekta sve dok postoji serverski objekat. Preporučuje se da pogledate dokumentaciju implementacije klase za više informacija.

Da li je server spreman?

Indy komponente koje se koriste u Delphiju 6.

Pored osnovnih Internet servisa i protokola, postoji širok spektar dodatnih usluga, čije mogućnosti često koriste internet programeri. Osim toga, mogućnost prikaza informacija pomoću pretraživača nije uvijek prihvatljivo rješenje za internet aplikacije. U ovom slučaju, razumno je koristiti internet infrastrukturu za razmjenu podataka, te omogućiti prikaz informacija kroz složenije klijentske aplikacije razvijene, na primjer, u Delphiju.

Recimo da trebate implementirati specijaliziranu serversku logiku koja nije uključena u standardne web servere. Da bi riješio ovu klasu problema, Delphi uključuje Internet Direct (Indy) biblioteku od Nevrona Designs (http://www.nevrona.com/Indy/). Ova biblioteka, razvijena posebno za Borland Delphi, već ima osam verzija, od kojih je najnovija uključena nova verzija Delphi. Skup komponenti je podijeljen u tri grupe: klijent (Indy Client), server (Indy Servers) i pomoćni (Indy Misc).

Indy klijenti i Indy serveri

Većina Indy komponente Client i Indy serveri su parovi koji odgovaraju klijentskom i serverskom dijelu protokola i usluga (sa izuzetkom pojedinačnih, uglavnom komponenti baziranih na serveru kao što su TunnelMaster i TunnelSlave), i dozvoljavaju korištenje protokola kao što su TCP/IP, UDP, NNTP, SMTP, FTP, HTTP, kao i usluge ECHO, FINGER, WHOIS itd.

Komponente Indy klijenta se pišu pomoću utičnica. Utičnica na strani klijenta zahtijeva vezu sa serverom. Ako je veza uspostavljena, klijent i server mogu početi razmjenjivati ​​poruke. Ove poruke su različite prirode, ali se obično razmjena odvija korištenjem određenog protokola (na primjer, HTTP)

TIdTCPClient i TIdTCPServer

Ove komponente se koriste za podršku jednog od glavnih mrežnih protokola - TCP (Transmission Control Protocol), a ujedno su i osnovne klase za TIdSMTP i TIdFTP komponente. Klasa TIdTCPServer ima svojstvo ThreadMgr koje je zadano na nulu. Ako je ThreadMgr nula kada je TIdTCPServer omogućen, klasa TIdThreadMgrDeafault će biti kreirana implicitno. U suprotnom, koristi se instalirani upravitelj procesa.

TIdUDPClient i TIdUDPServer

Ove komponente se koriste za podršku mrežni protokol UDP (User Datagram Protocol) i takođe su osnovne klase za brojne druge Indy komponente.

TIdChargenServer

Komponenta se koristi za generiranje nasumičnih simbola, obično u svrhe testiranja.

TIdDayTime i TIdDayTimeServer

Komponente se koriste za pružanje vremenske usluge. Klijent traži, a server prijavljuje trenutni datum i vrijeme.

TIdDNSResolver

Ovo je komponenta klijenta koja opslužuje zahtjeve sa DNS (Domain Name Service) servera. Upiti DNS servera su dizajnirani da zamene ime računara njegovom IP adresom. TIdDNSResolver je potomak klase TIdUDPClient.

TIdDICTServer

Serverska komponenta koja podržava Dictionary Server Protocol (DICT), rečnik na strani servera zasnovan na TCP protokolu koji omogućava klijentu da pristupi rečniku prirodnog jezika.

TIdDISCARDServer

Serverska komponenta koja podržava poslužitelj zapisa. Snimci se mogu koristiti kao alat za otklanjanje grešaka i mjerenje. Služba evidencije jednostavno predaje sve podatke onome ko je voljan da ih primi.

TI dEcho i TI dECHOServer

Komponente su dizajnirane da pruže uslugu odgovora, koja se obično koristi za provjeru zdravlja mreže. Klijent šalje tekstualnu poruku serveru, server vraća poruku klijentu. Ako je poruka iskrivljena, mreža ne radi.

TIdFinger i TIdFingerServer

Komponente su dizajnirane da obezbede protokol koji omogućava korisniku da traži podatke u vezi sa prisustvom drugih korisnika na sistemu. Neki serveri obrađuju takve zahtjeve klijenata. Korištenje ovog para komponenti će vam omogućiti da servisirate zahtjeve klijenata koji određuju prisustvo drugih korisnika na sistemu.

Komponenta uključuje punu podršku za protokol za prijenos datoteka - FTP (File Transfer Protocol). Podržan je pasivni i aktivni prijenos podataka, kao i operacije kao što su GET i PUT, brisanje direktorija, dobivanje kvota, veličina datoteka i direktorija. TI dFTP koristi klasu TIdSimpleServer za rad. Kada je prijenos FTP datoteke u toku, otvara se sekundarna TCP veza za prijenos podataka i zatvara se kada se podaci prenesu. Ova veza se zove "data link", jedinstvena za svaki fajl koji se prenosi.

TIdGopher i TIdGopherServer

Ove komponente su dizajnirane da obezbede mrežni protokol koji je zamenjen U poslednje vreme sa WWW ( World Wide Web) HTTP protokol. Server koji implementira ovaj protokol pruža hijerarhijski distribuirani sistem podrške protoku dokumenata. Primjer korištenja ovog para komponenti, koji se nalazi u direktoriju demosindyGopherClient i demosindy GopherServer, pokazuje kako pomoću ovog protokola možete pružiti informacije na lokalnoj mreži o datotekama koje se nalaze na vašem računalu, uključujući one zatvorene.

TIdHostNameServer

Serverska komponenta dizajnirana za prosljeđivanje imena lokalnog poslužitelja klijentima.

TIdHTTP i TIdHTTPServer

Komponente se koriste za obezbeđivanje HTTP mrežnog protokola (podržane su verzije 1.0 i 1.1, uključujući GET, POST i HEAD operacije). Osim toga, pruža se podrška za autentifikaciju i korištenje proxy servera. Serverska komponenta se koristi za pružanje usluga drugom Web serveru koji podržava dati protokol. TIdHTTPServer olakšava implementaciju funkcija kao što su kolačići, upravljanje stanjem itd.

TIdIcmpClient

Komponenta klijenta dizajnirana da obezbijedi Internet Control Message Protocol (ICMP), koji se koristi za obavljanje ping operacija i praćenje mreže.

Komponenta klijenta dizajnirana da obezbedi Post Office Protocol (POP), uključujući podršku za MIME kodiranje i dekodiranje, i prenos višebajtnih znakova.

TIdIMAP4Server

Serverska komponenta dizajnirana da podrži IMAP (Internet Message Access Protocol) operacije na serveru. Protokol vam omogućava da tražite poruke Email na serveru. Razlika između IMAP i POP protokola je u tome što POP protokol zahtijeva dodatna memorija za pohranjivanje podataka, a IMAP protokol pristupa serveru umjesto klijentskoj mašini. IMAP4 je kreiran da zameni POP3, ali POP3 ostaje široko korišćen standard do danas.

TIdIRCServer

Serverska komponenta dizajnirana da podrži najčešće korištene servisne operacije na Internetu, koje se obično nazivaju chat. Komponenta pruža osnovne blokovi za IRC (Internet Relay Chat) server.

TIdMappedPortTCP

Serverska komponenta dizajnirana za kreiranje mapiranih portova, koji se često koriste u proxy serverima. Metode ove komponente omogućavaju vam da mapirate jedan port na drugi. Na primjer, port 80 bi se mogao mapirati na port 3000, a svi zahtjevi prema prvom portu (port 80) bi bili proslijeđeni na drugi port (port 3000).

TIdNNTP i TIdNNTPServer

Ove komponente su potrebne za podršku protokola za prijenos mrežnih vijesti (NNTP) koji se koristi u servisima vijesti. Klijentska komponenta uključuje podršku za MIME kodiranje i dekodiranje, kao i podršku za višebajtne znakove i alternativna kodiranja. Serverska komponenta vam omogućava da kreirate servere vesti. Važno je napomenuti da TIdNNTPServer nije potpuno opremljen server vijesti, već komponenta koja pruža osnovnu funkcionalnost za takav server.

TIdQOTD i TIdQOTDServer

Komponente se koriste za pružanje usluge Citat dana. Klijentska komponenta se povezuje na instancu komponente servera da dobije dnevnu ponudu. Svaka instanca servera sadrži jedinstvenu bazu podataka citata.

Klijentska komponenta dizajnirana za korištenje u aplikacijama Simple Mail Transfer Protocol (SMTP), pruža podršku za autentifikaciju, MIME kodiranje i dekodiranje, i podršku za višebajtne znakove.

Klijentska komponenta dizajnirana da pruži SNTP (Simple Network Time Protocol) - vremensku uslugu. Može se koristiti za povezivanje s bilo kojom vremenskom uslugom za određivanje trenutni datumi i vrijeme.

TIdSimpleServer

Serverska komponenta koja pruža lagani TCP server. Omogućava vam da organizirate vezu od tačke do tačke. Koristi se za kreiranje servera sa jednim korisnikom, odnosno može poslužiti samo jednu po jednu vezu. Za razliku od komponente TIdTCPServer, ona ne pokreće sekundarne procese kada čeka zahtjeve klijenata i prilikom obrade ovih zahtjeva. Drugim riječima, ako server servira zahtjev od klijenta, a u to vrijeme ga drugi klijent kontaktira da se poveže, tada će biti blokiran do kraja obrade prvog zahtjeva.

TIdTelnet i TIdTelnetServer

Komponenta klijenta se koristi za organizovanje udaljenih sesija na drugom računaru, uključujući pregovore na konzoli i autentifikaciju. Komunikacijski protokol pretpostavlja prisustvo osobe koja interaktivno komunicira sa serverom. Klijentska komponenta nema podršku za prikaz ili emulaciju terminala, već jednostavno pruža vezu sa serverskim dijelom. Obično se serverski protokol TIdTelnetServer koristi za organizovanje udaljenih baza podataka sa tekstualnim interfejsom za interaktivnu interakciju sa klijentima.

TIdTime i TIdTimeServer

Klijentska komponenta je alternativa TIdSNTP komponenti za određivanje vremena. Važno je napomenuti da se formati ova dva protokola razlikuju. TIdTime je baziran na RFC 868 formatu (vraća vrijeme u internom UNIX OS standardu, izvodeći sve potrebne konverzije). Serverska komponenta je slična u funkcioniranju kao i DayTime server. Može se koristiti za implementaciju vremenske usluge na lokalni računar. Nije potreban dodatni kod, samo kreirajte instancu TIdTimeServera koja će vratiti vrijeme internog sata serverskog računara.

TIdTrivialFTP i TIdTrivialFTPServer

Ove komponente su neophodne za organizovanje jednostavnog protokola za prenos datoteka. Klijentska komponenta ovog protokola se koristi za povezivanje na instancu odgovarajuće serverske komponente. Protokol je namijenjen privatnim, lakim, lokalnim slučajevima prijenosa datoteka, na primjer u lokalnim mrežama ili za učitavanje (upload) tabela rutiranja u rutere. Zbog oslabljenih karakteristika ovog protokola, njegova upotreba se ne preporučuje kada se koriste algoritmi za autentifikaciju ili bilo koji drugi sigurnosni mehanizam. Glavna svrha ovog protokola je prijenos datoteka na hardverski uređaj u svrhu njegove izmjene.

TIdTunnelMaster i TIdTunnelSlave

Komponente tunela servera se koriste u proxy serverima za organizovanje više logičkih veza preko jednog fizičkog (tunela). Ove klase se mogu koristiti u različite svrhe, na primjer, za organiziranje tajne veze preko netajnih kanala.

TIdWhois i TIdWhoIsServer

Ova klijentska komponenta se povezuje na bilo koji standardni Whois server, omogućavajući vam da dobijete informacije o domenima. Serverska komponenta pruža osnovnu funkcionalnost NIC servera.

Indy Misc

Stranica palete Indy Miscellaneous Components uključuje BASE64, UUE, Quoted Printable i druge uobičajene komunikacijske formate e-pošte, enkodere (MD2, MD4 i MD5) za standarde kriptografije koji se koriste za pohranjivanje lozinki i elektronski potpisi u nepovratnom (teško dešifrljivom) obliku, kao i mnoge druge korisne komponente i uslužne programe koji se često koriste u razvoju internetskih aplikacija.

TIdAntiFreeze

Zbog blokova baziranih algoritama Indy komponenti, često se čini da je aplikacija zaglavljena dok veza radi. Da biste eliminirali korištenje sekundarnih procesa (threads) prilikom organiziranja komunikacija kako bi se spriječilo zamrzavanje aplikacije, dovoljno je postaviti navedenu komponentu na obrazac.

Komponenta radi tako što analizira zahtjeve iz steka TCP/IP protokola i šalje poruke aplikaciji tokom kašnjenja kada su eksterne veze blokirane, što stvara iluziju pokretanja koda. Budući da komponenta utječe na blokirane veze samo za glavni proces, upotreba TIdAntiFreeze u sekundarnim procesima aplikacije nije potrebna. Imajte na umu da komponenta TIdAntiFreeze usporava veze jer se glavni proces povremeno prekida radi obrade poruka. Iz toga slijedi da se mora voditi računa da aplikacija koja se razvija ne troši previše vremena na obradu poruka, uključujući OnClick, OnPaint, OnResize, itd. Do neke mjere, ovo se može kontrolisati kroz svojstva klase TIdAntiFreeze. Upotreba ove komponente nije obavezna, ali vam omogućava da riješite problem sinhronizacije veza sa vizuelnim interfejsom aplikacije.

TIdDateTimeStamp

Klasa za izvođenje matematike datuma i vremena koja se odnosi na činjenicu da internet protokoli koriste različite formate datuma i vremena; pored toga, klijenti i serveri se mogu nalaziti u različitim vremenskim zonama.

TIdIPWatch

To je komponenta bazirana na tajmeru koja stalno prati promjene u IP adresi računara. Događaji komponente se javljaju kada se otkrije promjena. Ova komponenta se obično koristi za otkrivanje da li je računar povezan na Internet ili bilo koju drugu mrežu. Do promjene IP adrese u ovoj situaciji može doći zbog IP adrese koju dodjeljuje DHCP (Dynamic Host Configuration Protocol) server prilikom povezivanja na novu mrežu.

TIdLogDebug

Svrha ove komponente je presretanje događaja bilo koje komponente klijenta ili servera i postavljanje zapisa o događaju specificirani fajl. Ova komponenta je vrlo korisna za otklanjanje grešaka u Indy komponentama.

TIdMessage

Komponenta se koristi u kombinaciji s drugim komponentama za pravilno dešifriranje ili kodiranje poruka. To mogu biti POP, SMTP i NNTP komponente. Klasa podržava MIME enkripciju i dešifriranje, višebajtne znakove i ISO kodiranje.

TIdNetworkCalculator

Jedna od rijetkih Indy komponenti koje se mogu koristiti pri izgradnji aplikacija. Mrežni kalkulator se može koristiti za izvođenje proračuna na IP adresama, uključujući mrežne maske, podmreže, mrežne klase itd.

TIdThreadMgrDefault

Komponenta podrazumevano obezbeđuje kontrolu nad sekundarnim procesima. Kreira se kada bilo koja Indy komponenta koja podržava upravljanje procesima nema definiranu instancu klase TIdThreadManager. Komponenta pruža samo osnovne mogućnosti za upravljanje sekundarnim procesima: njihovo kreiranje i uništavanje na zahtjev.

TIdThreadMgrPool

Naprednija komponenta upravljanja procesima od TIdThreadMgrDefault jer spaja procese umjesto da ih stvara ili uništava na zahtjev.

TIdVCard

VCard je elektronski ekvivalent vizit karte i može sadržavati lične podatke vlasnika i grafičke podatke.

TIdIMFDecoder

Dizajniran za dekodiranje Internet poruka. On je potomak klase TIdCoder, baš kao i sve ostale komponente kodera. Klasa TIdCoder dekodira prema standardu ARPA Internet tekstualnih poruka RFS-822, predloženom u avgustu 1982. godine, i USENET standardu za razmjenu poruka RFC 1036, predloženom u decembru 1987. godine.

Komponenta proširuje klasu TIdCoder kako bi omogućila detekciju RFS-822 formata po kontekstu zaglavlja, pružajući način dešifriranja po prijemu i MIME enkripciju i dešifriranje. Komponenta TIdIMFDecoder se koristi u klasi TIdMessageClient za dekodiranje primljenih i poslanih poruka.

TIdQuotedPrintableEncoder

QuotedPrintableEncoder vam omogućava dešifriranje teksta u navedenom formatu. Može poslužiti kao samostalna komponenta sa specificiranim tipom kodiranja, omogućavajući slanje poruka koje sadrže novi tip kodiranja.

TIdBase64Encoder

Implementira drugi algoritam šifriranja koji omogućava prijenos znakova koji se ne mogu ispisati.

TIdUUEncoder

Implementira jedan od prvih algoritama za šifriranje, UU kodiranje. Ponekad se koristi prilikom slanja članaka na novinsku službu.

TIdXXEncoder

Ova metoda šifriranja se vjerovatno neće ikada koristiti. U suštini, ovo je isto UU kodiranje, ali sa različitom tablicom šifriranja.

TIdCoderMD2

Komponente s različitim tipovima MD (Message Digest) algoritma šifriranja. Svi su zasnovani na nasumičnom rasporedu, jednosmerni i nemaju algoritame za dešifrovanje.

Komponente protokolarnih klijenata i servera mogu se koristiti za razvoj serverskih i klijentskih Internet aplikacija, zajedno sa ili umjesto osnovnih (ClientSocket, ServerSocket) i drugih komponenti iz palete Interneta i Fastnet. Indy komponente ne koriste WebBroker arhitekturu, implementirajući podršku niskog nivoa za internet protokole i usluge direktno u svom izvornom kodu ( izvorni kodovi su u prilogu).

TIdConnectionInterceptOpenSSL i TIdServerInterceptOpenSSL

SSL protokol - Secure Sockets Layer, koji osigurava tajnost i pouzdanost komunikacije između dvije aplikacije, ima dva sloja. Na niskom nivou višeslojnog transportnog protokola (kao što je TCP), SSL je protokol za snimanje i koristi se za kapsuliranje različitih protokola višeg nivoa. Prednost SSL-a je u tome što je nezavisan aplikacijski protokol, ali se protokol višeg nivoa može koristiti na vrhu SSL-a.

SSL pruža sigurnost komunikacije, koja ima tri glavne funkcije: obezbjeđivanje povjerljive veze; enkripcija sa javni ključ(koristi se za potvrdu autentičnosti primaoca); podrška za pouzdanost prenosa podataka.

  • Simetrična kriptografija se koristi za šifriranje podataka (npr. DES, RC4, itd.).
  • Digitalni potpis se obezbjeđuje korištenjem asimetrične enkripcije javnog ključa (na primjer, RSA, DSS, itd.).
  • Pouzdanost komunikacije, transport poruka uključuje provjeru integriteta poruke kroz MAC ispravne kodove, sigurne hash funkcije (npr. SHA, MD5, itd.) korištenjem MAC proračuna.

U kombinaciji sa HTTP i autentifikacijom servera, SSL pruža potrebne funkcije enkripciju i dalje održava uspostavljenu vezu, dvostruku provjeru autentičnosti web servera itd. Važno je shvatiti da SSL samo štiti komunikaciju tokom prijenosa podataka i ne zamjenjuje druge sigurnosne mehanizme.

Komponente TIdConnectionInterceptOpenSSL i TIdServerInterceptOpenSSL pružaju veze i na strani klijenta i na strani servera koristeći SSL protokol. Treba napomenuti da su komponente TIdConnectionInterceptOpenSSL i TIdServerInterceptOpenSSL dostupne samo u Delphiju 6, ali ne i u Kylixu. To je zbog složenosti protokola, koji se u slučaju Windows implementacije zasniva na funkcijama operativnog sistema.

Primeri korišćenja Indy komponenti mogu se naći u direktorijumima /Delphi6/Demos/Indy. Ukupno, Indy biblioteka u verziji 8.0 sadrži 69 komponenti. Navodi se da će u verziji 9.0 navedena biblioteka sadržavati 86 komponenti. Sve komponente su objedinjene i uključene u Delphi 6 i Kylix, što im omogućava da se koriste za razvoj cross-platform aplikacija. Sve Indy komponente podržavaju multithreading.

Indy komponente implementiraju gotovo sve funkcionalnosti koje se nalaze u komponentama Interneta i Fastneta, kao što je jasno prikazano u tabeli.

Fastn et components Indy komponente Namjena komponenti
1 TserverSocket, TClientSocket TIdTCPserverSocket, TIdTCPClientSocket Interakcija između dva računara (klijent i server) koristeći TCP/IP protokol
2 TNMDayTime TIdDayTime, TIdDayTimeServer Upitajte server za trenutno vrijeme
3 TNMEcho TIdEcho, TIdEchoServer Koristi se za komunikaciju sa serverom odgovora
4 TNMFinger TIdFinger, TIdFingerServer Koristi se za dobijanje informacija o korisniku sa servera za internet pretragu
5 TNMFTP TIdFTP, TIdTrivialFTP, TIdTrivialFTPServer Omogućite prijenos datoteka koristeći FTP protokol
6 TNMHTTP TIdHTTP, TIdHTTPServer Koristite HTTP protokol za razmjenu podataka
7 TNMMsgServ, TNMMsg Koristi se za prijenos jednostavnih tekstualnih poruka od klijenta do servera
8 TNMNNTP TIdNNTP, TIdNNTPServer Podržava razmjenu podataka sa serverom vijesti
9 TNMPOP3 TIdPOP3 Koristi se za primanje e-pošte sa servera pošte koristeći POP3 protokol
10 TNMSMTP TIdSMTP Koristi se za slanje e-pošte putem Internet mail servera
11 TNMStrm, TNMStrmServ Prenosi binarne podatke upisane u tok koristeći TCP/IP protokol
12 TNMUDP TIdUDP, TIdUDPServer Prenesite podatke koristeći UDP protokol
13 TpowerSock, TNMGeneralServer Komponentne enkapsulirane klase koje su osnova za pisanje vlastitih klijenata (Powersock) i servera (NMGeneralServer)
14 TNMUUProcessor TIdUUEkoder, TIdUUDekoder Izvršiti kodiranje binarne datoteke u MIME ili UUENCODE format
15 TNMURL Pretvara nizove u HTML format i vrši obrnuto rekodiranje

Izuzetak su klase kao što su TNMMsgServ, TNMMsg, TNMStrm, TNMStrmServ, TpowerSock, TNMGeneralServer, TNMURL, koje ili implementiraju zastarjele protokole ili imaju funkcionalnost implementiranu u velikoj grupi alternativnih klasa.

Međutim, za razliku od svojih prethodnika – Internet i Fastnet komponenti, Indy sadrži bogatije serverske komponente i komponente za transkodiranje i enkripciju podataka, kao i podršku za autentifikaciju (Indy Misc paleta). Kao što se može vidjeti iz gornje tabele, glavne protokole i usluge pružaju ne samo klijentske, već i serverske komponente. To su servisi vremena, usluge odgovora, dobijanje korisničkih informacija, kao i HTTP, NNTP, UDP protokoli, pa čak i najjednostavnija verzija FTP-a.

Neki primjeri korištenja Indy komponenti

U Indy komponentama sadržanim u Delphiju, IP adresa je definisana u svojstvu Host, obično samo u klijentskim aplikacijama. Komponente koje se nalaze na serveru imaju metode koje vam omogućavaju da pokrenete ili zaustavite prozivanje odgovarajućeg porta - na primjer, promjenom svojstva Active komponente IdTCPServer pokreće ili zaustavlja prozivanje odgovarajućeg porta. Kada se uspostavi veza između klijenta i servera, može početi prijenos podataka.

Indy komponente stavljaju veliki naglasak na sigurnost i pouzdanost prilikom rada s podacima. Na primjer, komponenta IdTCPClient ima metode Connect i Disconnect. Koristeći tehniku ​​programiranja poput koda u nastavku sa strane klijenta:

Sa TCPClientom počnite Connect; pokušajte lstMain.Items.Add(ReadLn); konačno Disconnect; kraj; kraj;

i korištenje svojstva Connection proslijeđenog kao parametra AThread instanci klase TIdPeerThread sa strane servera:

Sa AThread.Connection započnite WriteLn("Zdravo sa Basic Indy Server servera."); Disconnect; kraj;

možete računati ili na normalno izvršavanje veze ili na ispravno rukovanje greškama.

Obratite pažnju na ReadLn i WriteLn metode odgovarajućih klasa - one liče na standardne Pascal I/O izjave. Ovo je priznanje UNIX tehnici programiranja, gdje se većina sistemskih operacija izvodi čitanjem i pisanjem u odgovarajuće datoteke.

Baš kao i Fastnet komponente, klase komponenti Indy imaju događaje koji se mogu koristiti za upravljanje događajima. Na primjer, možete urediti da se poruka prikaže na obrascu kada se povezujete s klijentom:

Procedura TForm1.IdECHOServer1Connect(AThread: TIdPeerThread); begin lblStatus.caption:= "[ Uslužni klijent]"; kraj;

Indy obezbeđuje komponente koje implementiraju protokole sa klijentskim i serverskim delovima koji su jedinstveni za ovu biblioteku. Komponente TIdGopherServer i TIdGopher, zahvaljujući metodama GetExtendedMenu, GetFile, GetMenu, GetTextFile na strani klijenta i ReturnGopherItem, SendDirectoryEntry na strani servera, pomažu u pregledu datoteka razne vrste, uključujući one označene kao skrivene, kao i direktorije na udaljeni računar(slično onome što komanda dir *.* radi u operativni sistem MS-DOS).

Koristeći komponente IdSMTP i IdMessage, možete jednostavno kreirati vlastitu web aplikaciju koja može slati poštu koristeći SMTP protokol.

U ovom slučaju, klasa IdMessage (jedna od 23 komponente sa stranice Indy Misc) je odgovorna za generiranje poruke, koja slijedi iz njenog imena, a IdSMTP je za organiziranje veze sa mail serverom.

Tehnologija koja se koristi u Indyju koristi zaključavanje operacija čitanja i pisanja. Bilo koja operacija povezivanja koja se koristi u Indyju čeka da se veza završi. Kada radite s komponentama Indy klijenta, obično morate učiniti sljedeće:

  • zatražiti vezu sa serverom;
  • napraviti zahtjeve za čitanje i pisanje serveru (u zavisnosti od tipa servera, korak se izvodi jednom ili se ponavlja više puta);
  • prekinuti vezu sa serverom i prekinuti vezu.

Indy komponente su dizajnirane da obezbede ultra visok nivo apstrakcije. Zamršenosti i detalji TCP/IP steka skriveni su od programera tako da se može fokusirati na zadatak koji mu je pri ruci.

Sljedeći mali primjer prikazuje tipičnu sesiju klijentskog bean-a:

Sa IndyClientom počnite Host:= "zip.pbe.com"; // Host za pozivanje Port:= 6000; // Port za pozivanje servera na Connect; try // Vaš kod ide ovdje konačno Disconnect; kraj; kraj;

U primjeru, čak i ako veza sa serverom nije uspostavljena, veza će biti graciozno prekinuta zbog upotrebe naredbe try-finally.

Indyjeve serverske komponente opisuju različite modele servera koji se mogu koristiti ovisno o vašim potrebama i protokolu koji koristite.

TIdTCPServer je najčešće korišćena serverska komponenta, koja stvara sekundarni proces nezavisno od glavnog procesa aplikacije. Kreirani proces čeka na dolazne zahtjeve od potencijalnim klijentima. Pojedinačni sekundarni proces kreira se za svakog klijenta na čiji zahtjev odgovara. Događaji koji se dešavaju tokom procesa održavanja povezani su sa kontekstom odgovarajućih procesa.

Drugim riječima, za svaku klijentsku vezu, klasa TIdTCPServer koristi jedinstvenu sekundarnu nit pozivajući obrađivač događaja OnExecute te niti. Formalni parametar metode OnExecute je referenca na instancu klase Athread koja odgovara kreiranoj niti. Svojstvo Connection ove klase je referenca na klasu TIdTCPConnection, čija se instanca kreira za obradu zahtjeva klijenta. TIdTCPConnection podržava čitanje i pisanje preko veze, kao i uspostavljanje i prekid komunikacijske sesije.

UDP protokol radi bez prethodnog uspostavljanja veze sa serverom (svaki poslani paket je nezavisan skup podataka, a ne deo veće sesije ili veze). Dok TIdTCPServer stvara zasebne niti za svaku vezu, TIdUDPServer koristi ili glavnu nit ili jednu sekundarnu nit koja obrađuje sve zahtjeve UDP protokola. Kada je TIdUDPServer aktivan, kreira se nit za slušanje dolaznih UDP paketa. Za svaki primljeni paket, događaj OnUDPRead se pokreće ili na glavnoj niti ili u kontekstu niti slušanja, ovisno o vrijednosti svojstva ThreadedEvent. Kada ThreadedEvent procijeni na False, događaj se javlja u glavnoj niti, u suprotnom se javlja u niti koja sluša. Dok se događaj obrađuje, druge operacije servera su blokirane. Stoga je važno osigurati da se OnUDPRead procedure izvode što je brže moguće.

Ako trebate kreirati novu klijentsku aplikaciju za postojeći poslužitelj koristeći postojeći protokol, vaš posao je samo da razvijete i otklonite greške u klijentskoj aplikaciji. Međutim, kada morate razviti i klijenta i serverska aplikacija Bilo da koristimo postojeći ili novi protokol, suočeni smo s klasičnim problemom „kokoške i jaja“. Gdje započeti programiranje - sa klijenta ili sa servera?

Očigledno, i klijent i server moraju biti kreirani na kraju. Za mnoge aplikacije, posebno one koje koriste protokol zasnovan na tekstu (kao što je HTTP), lakše je započeti izgradnju aplikacije dizajniranjem servera. A za otklanjanje grešaka postoji pogodan klijent koji već postoji. Ovo je Telnet konzolna aplikacija koja je dostupna i na Windows i na UNIX-u.

Ako ukucate konzolu telnet komanda 127.0.0.1 80 sa IP adresom lokalnog računara i brojem porta 80, koji se podrazumevano koristi od strane Web servera, onda će aplikacija odgovoriti tekstom prikazanim na Sl. 6, u slučaju Windows 2000 OS i IIS 5.0.

Da biste kreirali najjednostavniji server koristeći Indy komponente, trebate:

Ako trebate dizajnirati server koji će ne samo ispravno obavijestiti svoje klijente kada se veza izgubi, već će im pružiti i informacije o situacijama greške koje su se dogodile, koristite naredbu try-except umjesto try-finally - na primjer, kao prikazano u sljedećem primjeru:

Procedura TDataModule1.IdTCPServer1Execute(AThread: IdPeerThread); var s: String; započnite sa AThread.Connection pokušajte pokušajte s:= ReadLn; // Izvrši zadatak servera ovdje // ako se ne pojavi izuzetak, // ispiši odgovor servera WriteLn(s); osim na e: Izuzetak do begin WriteLn(e.Message); end; //on end; //pokušaj osim konačno Disconnect;end;end;

Ovaj mali primjer pokazuje korake za kreiranje jednostavnog tekstualnog servera, kao i kako ga otkloniti.

Gore opisani server je tipičan primjer organizacije modernog distribuiranog računarstva.

Značajke kreiranja višeslojnih aplikacija

U posljednje vrijeme, višestruki serveri se sve više koriste za zadovoljavanje zahtjeva klijenata. Server ovog tipa, nakon što je primio zahtev klijenta i delimično ga pripremio za dalju obradu, kontaktira drugi server i šalje mu transformisani zahtev ili zahteve. Server drugog nivoa može, zauzvrat, komunicirati sa drugim serverima. Dakle, možemo govoriti o višeslojnoj arhitekturi servera.

Zatim ćemo kreirati server za pristup podacima čija je svrha vraćanje podataka iz baze podataka. Ovaj server, međutim, ne čita niti upisuje direktno u datoteke baze podataka. Umjesto toga, komunicira sa serverom baze podataka u potrazi za podacima koje zahtijeva klijent.

Dakle, počinjemo da razvijamo aplikaciju sa troslojnom arhitekturom. Da biste kreirali server baze podataka koristeći Indy komponente potrebno vam je:

  1. Kreirajte novi projekat.
  2. Stavi na glavni oblik projektna instanca komponente TIdTCPServer iz Indy Servers palete.
  3. Postavite svojstvo DefaultPort instance klase TIdTCPServer1 na 6001 (preporučljivo je dodijeliti velike vrijednosti kako biste izbjegli dupliciranje brojeva portova u različitim aplikacijama) i postavite svojstvo Active na true.
  4. Dodajte novi modul projektu odabirom File | Novo | Data Module i postavite instance SQLConnection i SQLDataSet komponenti na njega s kartice dbExpress na paleti komponenti.
  5. Postavite svojstvo ConnectionName klase SQLConnection na IBLocal i LoginPrompt na False. Ako niste konfigurirali IBLocal u bazi podataka employee.gdb, prvo dovršite ovu proceduru.

Zdravo svima!

Prilikom razvoja sljedećeg web projekta pojavio se zadatak - implementirati klijentski softver u Delphi, koji bi prenosio podatke na server koristeći POST metodu. Aplikacija mora prenijeti tekst i prenijeti datoteke na web server.

Implementacija takvog slanja podataka korištenjem jezika na strani servera Web development(na primjer, PHP) je prilično jednostavan, ali ako trebate pisati softver za više korisnika zasnovan na aplikaciji koji je u interakciji sa serverom, onda je to malo komplikovanije. Način direktnog povezivanja na bazu podataka i preko FTP-a na server iz Delphija više nije potreban jer nije sigurno, nije pouzdano (promjena lozinki, podataka o konekciji, itd.) i stvara dodatne. problemi sa kompatibilnošću softvera na strani klijenta. Da riješim problem, odlučio sam da napišem skripte (serverski dio) u PHP-u koje će obrađivati ​​dolazne POST zahtjevi i vratite rezultat klijentu (Delphi aplikacija). Prednosti ovakvog pristupa su što se sve veze i obrada podataka odvijaju na serveru, što je mnogo sigurnije od direktne „veze“.

Kada sam počeo da guglam, odustalo se od dosta razbacanih informacija, uglavnom po forumima, ali sve je bilo u komadima. Jedna stvar je bila sigurna da će se koristiti Indy, naime IdHTTP komponenta sa implementiranom POST metodom. U stvari, sve je jednostavno, ovu metodu uzima dva parametra Url resursa i DataStream (tok podataka) i vraća rezultat u tekstualnom obliku (može biti i HTML kod stranice). Glavna stvar je bila ispravna formacija DataStream-a (toka prenesenih podataka), ali usput su se pojavile dodatne zamke, odnosno rusko kodiranje (ako nije bilo dobro). Tu je počela zabava u višesatnom lutanju internetom. Generalno, dosta čavrljanja, idemo na praksu i implementaciju softvera.

Dakle, program je jednostavan. Ona mora poslati podatke na server koristeći POST metodu, podaci sadrže " Naslov " (red), " Opis » ( višelinijski tekst) I grafički fajl(jpg,png,gif-binarni podaci). Server mora prihvatiti ove podatke, obraditi ih, sačuvati grafički fajl na serveru i vratiti odgovor. Kao odgovor, vratićemo Delphi u aplikaciju, isti tekst samo sa dodanim oznakama i vezom do preuzete datoteke. Ništa drugo.

Počnimo sa implementacijom serverskog dijela (slično API-ju stranice). Otvori bilo koji uređivač teksta(notepad) i u njega upišite sljedeći kod:

"; ) else ( echo "Naslov: nedostaje"."
"; ) //Provjerite dolazne podatke da li postoje podaci polja "content" if (!empty($_POST["content"]))( echo "Sadržaj: ".$_POST["content"]."
"; ) else ( echo "Sadržaj: nedostaje"."
"; ) //Provjerite dolazne podatke da li postoji priložena datoteka "file" ako (!empty($_FILES["file"])) ( $finfo = pathinfo($_FILES["file"]["name" ]); / /dobiti informacije o datoteci (naziv, ekstenzija, itd.) //Provjeriti tip datoteke na listi dozvoljenih tipova (IMPROVIZACIJA:)) if (stripos("jpgpnggif",$finfo["extension"] )==0)( echo ">>>>>>>Nevažeći tip datoteke<<<<<<<<"; exit; //Если не допустим тип, полностью останавливаем скрипт } $fname = "files/" . "testimgfile." . $finfo["extension"]; //формируем путь и новое имя файла move_uploaded_file($_FILES["file"]["tmp_name"],$fname);//сохраняем временный файл "tmp_name" в файл $fname echo "http://".$_SERVER["HTTP_HOST"]."/".$fname; //возвращаем полный путь к файлу } ?>

Bilješka! Prilikom pohranjivanja (putem notepad-a) morate navesti kodiranje “UTF-8”, inače će biti problema s prikazom ćirilice!

Scenarij je pokušao dati detaljne komentare. Kopirajte ovu skriptu na vaš web server, ako ga nemate, možete koristiti moju skriptu za test, nalazi se na: http://api..php

Izgled koristi sledeće komponente: Label, Button (2 kom.), Edit (2 kom.), Memo (2 kom.), CheckBox, OpenDialog, IdHTTP. Navedite imena sljedećih komponenti (svojstvo “ Ime”):

  1. Uredi (naslov) – Ime=naslov;
  2. Uredi (put do fajla) Ime = imgfile;
  3. dopis (sadržaj)Ime = sadržaj;
  4. Bilješka (rezultat) – Ime = odgovor;
  5. Dugme (…) – Ime = chkfile;
  6. Dugme (POST) – Ime = PostAli;
  7. OpenDialog (dijalog za odabir datoteke) – Naziv = PictDialog;

Ostavimo IdHTTP1 i CheckBox1 nepromijenjeni (umorni! :)))).

Da ne bi slučajno" edit» put do Edit( imgfile), postavite svojstvo ReadOnly na True. Isto tako, kod imgfile I chkfile Postavite svojstvo Enabled na false. Aktiviraćemo ih pomoću CheckBox-a, tj. Pružit ćemo vam mogućnost izbora da li ćete postaviti sliku ili ne.

Za OpenDialog( PictDialog) trebate postaviti filter (svojstvo filtera) na sljedeći način:

Prava vizuelna priprema je gotova! Počnimo s kodiranjem!

U projektu ćemo generirati tok podataka koristeći tip uključen u Indy - TidMultiPartFormDataStream. Iako smo naišli na opcije implementacije koristeći TStream, radeći sa TidMultiPartFormDataStream – lakše!

Da bismo ovaj tip učinili dostupnim našem projektu, moramo dodati sljedeću biblioteku u Uses: IdMultipartFormData.

Za CheckBox1, kreirajte događaj OnClick (dvostrukim klikom miša na objekt) i dodajte sljedeći kod ovom događaju:

Procedura TForm1.CheckBox1Click(Pošiljalac: TObject); započeti //učiniti aktivnim ili neaktivnim elemente putanje datoteke i dugmad za dijalog imgfile.Enabled:=CheckBox1.Checked; chkfile.Enabled:=CheckBox1.Checked; kraj;

Ovdje aktiviramo objekte imgfile Ichkfile ovisno o prisutnosti kvačice (ako je potvrdni okvir označen, tada objekti postaju aktivni).

Sada organizirajmo odabir slike. Da biste to uradili, kreirajte događaj OnClick na dugmetu chkfile(takođe dvostrukim klikom na objekt) i napišite sljedeće:

Procedura TForm1.chkfileClick(Pošiljalac: TObject); započnite //otvorite dijalog i unesite punu putanju do datoteke u imgfile(TEdit) if PictDialog.Execute then imgfile.Text:= PictDialog.FileName; kraj;

Ovaj događaj će pokrenuti dijalog za odabir slike i ako korisnik klikne " Otvori", tada će se dodati putanja do ove datoteke imgfile.

I sada dolazimo do konačnog dugmeta “POST”. Kreirajte događaj OnClick za ovo dugme i dodajte sljedeći kod:

Procedura TForm1.PostButClick(Pošiljalac: TObject); var dataPost:TIdMultiPartFormDataStream; započeti dataPost:=TIdMultiPartFormDataStream.Create; dataPost.AddFormField("title",title.Text,"utf-8").ContentTransfer:= "8bit"; dataPost.AddFormField("content",content.Text,"utf-8").ContentTransfer:= "8bit"; if CheckBox1.Checked i (trim(imgfile.Text)="") then //provjera da li je datoteka odabrana ili ne počinje ShowMessage("Morate odabrati grafičku datoteku!"); Izlaz; kraj; ako je CheckBox1.Checked onda dataPost.AddFile("file",imgfile.Text,""); //dodajte polje sa odgovorom datoteke.Text:= StringReplace(idHTTP1.Post("http://api..php",dataPost),"
",#13#10,); datapost.Free; end;

Dakle, redom (iako ima komentara):

Datapost – objekt tipa TIdMultiPartFormDataStream. Omogućava vam da kreirate strukturu POST zahtjeva koja se sastoji od polja različitih tipova.

dataPost . AddFormField (" naslov ", naslov . Tekst ," utf -8 "). ContentTransfer := " 8 bit "; – dodaje polje pod nazivom “title” u DataPost, vrijednost iz “title.Text”, postavlja kodiranje prenesenih podataka na “utf-8” (parametar nije obavezan, ali bez njegove eksplicitne naznake, ćirilica se prenosi sa upitnici “?”) i vrlo važan metod “Prenos sadržaja”. Bez ove metode, podaci se šalju na server " abrakadabra" Imajte na umu da naziv polja (“naslov”) na strani za slanje mora odgovarati imenu navedenom u skripti: $_POST["title"].

Podaci se prenose slično polju „sadržaj“.

dataPost . AddFile (" fajl ", imgfile . Tekst ,"") – ovom linijom kreiramo stream sa podacima iz datoteke.

To je to, podaci se generiraju, ostaje samo da ih prenesete u skriptu na serveru i dobijete odgovor:

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

jer TMemo ne razumije oznaku prijeloma reda "
", koristit ćemo funkciju " " da je zamijenimo razumljivim prijelomima redaka "#13#10".

Kada je sve završeno, očistite memoriju iz DataPost objekta sa linijom:

datapost.Free;

Iako će se u našem primjeru to dogoditi automatski na kraju procedure, ali ipak...

Stvarni rezultat programa na ekranu:

Dakle, možemo poslati onoliko podataka ili datoteka na server koliko želimo, obraditi ove podatke na serveru i prijaviti aplikaciji rezultat skripte. Može čak biti samo 0 ili 1, što će signalizirati aplikaciji da dalje reaguje.

Sve. Sretno svima. Nadam se da su informacije bile korisne i da ćete im naći koristi.

Možete preuzeti gotov primjer i skriptu.

Cijeli kod modula:

Unit PostUnit; interfejs koristi Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, IdBaseComponent, IdComponent, IdTCdTConneent IdHTTP, IdMultipartFormData, Vcl.ExtDlgs; tip TForm1 = klasa(TForm) IdHTTP1: TIdHTTP; naslov: TEdit; sadržaj: TMemo; PostBut: TButton; odgovor: TMemo; Oznaka1: TLabel; Label2: TLabel; Label3: TLabel; imgfile:TEdit; chkfile: TButton; Label4: TLabel; CheckBox1: TCheckBox; PictDialog:TOpenDialog; procedura PostButClick(Pošiljalac: TObject); procedura chkfileClick(Pošiljalac: TObject); procedura CheckBox1Click(Pošiljalac: TObject); privatni ( Privatne deklaracije ) javni ( Javne deklaracije ) kraj; var Form1: TForm1; implementacija ($R *.dfm) procedura TForm1.CheckBox1Click(Pošiljalac: TObject); započeti //učiniti aktivnim ili neaktivnim elemente putanje datoteke i dugmad za dijalog imgfile.Enabled:=CheckBox1.Checked; chkfile.Enabled:=CheckBox1.Checked; kraj; procedura TForm1.chkfileClick(Pošiljalac: TObject); započnite //otvorite dijalog i unesite punu putanju do datoteke u imgfile(TEdit) if PictDialog.Execute then imgfile.Text:= PictDialog.FileName; kraj; procedura TForm1.PostButClick(Pošiljalac: TObject); var dataPost:TIdMultiPartFormDataStream; započeti dataPost:=TIdMultiPartFormDataStream.Create; dataPost.AddFormField("title",title.Text,"utf-8").ContentTransfer:= "8bit"; dataPost.AddFormField("content",content.Text,"utf-8").ContentTransfer:= "8bit"; if CheckBox1.Checked i (trim(imgfile.Text)="") then //provjera da li je datoteka odabrana ili ne počinje ShowMessage("Morate odabrati grafičku datoteku!"); Izlaz; kraj; ako je CheckBox1.Checked onda dataPost.AddFile("file",imgfile.Text,""); //dodajte polje sa odgovorom datoteke.Text:= StringReplace(idHTTP1.Post("http://api..php",dataPost),"
",#13#10,); datapost.Free; end; end.