Delphi-applikationen skickar data till servern med POST-metoden (Indy). Indy-komponenter som används i Delphi

Indy är ett ganska kraftfullt paket med komponenter som låter dig utveckla olika nätverksapplikationer. I den här handledningen kommer jag att berätta hur du kan skapa klient-serverapplikationer med hjälp av komponenterna TIdTCPClient och TIdTCPServer.

Först och främst skulle jag vilja notera två viktiga fördelar med dessa komponenter. Den viktigaste av dem är multithreading, vilket innebär att servern skapar en separat tråd för varje klient, och detta påverkar säkert serverprogrammets prestanda på datorer med en flerkärnig processor. Den andra fördelen är användarvänligheten. 10-20 rader kod räcker för att skriva en enkel klient-serverapplikation. Detta paket med komponenter finns i standard Delphi-aggregat.

Låt oss skriva ett enkelt program, som låter dig överföra ett textmeddelande från en klient till en server. Låt oss börja skapa servern.
Låt oss placera IdTCPServer-komponenten från fliken "Indy-servrar" i formuläret. Vi kommer att göra alla inställningar för den här komponenten vid körning i OnCreate-händelsen i formuläret:
IdTCPServer1.DefaultPort:= 12345;
IdTCPServer1.Active:= sant;
Allt är enkelt här - vi anger porten som servern kommer att fungera på och aktiverar själva servern.

För att ta emot data på servern från klienten finns det en speciell händelse "OnExecute". Denna händelse ser ut så här:

Börja
slutet;

Låt oss redigera händelseinnehållet enligt följande:
procedure TForm3.IdTCPServer1Execute(AContext: TIdContext);
var
l:sträng; // strängvariabel som vi kommer att ta emot
Börja
l:= AContext.Connection.IOHandler.ReadLn();
Memo1.Lines.Add(l);
slutet;

Nu, så snart ett meddelande kommer till servern, kommer vi att skriva det till strängvariabeln l och mata ut det till ett flerrads textfält.

Detta slutar, inte överraskande, skapandet av servern. Indy gör resten åt oss. Låt oss börja med klientprogrammet. Den kommer att ansluta till servern, skicka ett meddelande till den och koppla från servern.

Låt oss skapa nytt projekt, placera IdTCPClient-komponenten på formuläret, som finns på fliken "Indy Clients". Vi kommer också att placera en enkel redigering och en knapp. Låt oss skapa en OnClick-händelsehanterare för knappen, i vilken vi kommer att skriva:
IdTCPClient1.Port:= 12345;
IdTCPClient1.Host:= '127.0.0.1';
IdTCPClient1.Connect;
IdTCPClient1.IOHandler.WriteLn(Edit1.Text);
IdTCPClient1.Disconnect;

Denna kod behöver inte placeras i OnCreate-händelsen. Du kan placera den här koden var du vill om du vill.
På den första raden tilldelar vi en port, och det är nödvändigt att ange samma port som vi angav i serverprogrammet, annars kommer klienten helt enkelt inte att hitta servern. Sedan anger vi serverns IP-adress. Själva servern kan placeras antingen i lokalt nätverk, och på distans. I det senare fallet kommer anslutningen att göras via Internet och du måste ange en IP-adress på Internet.

Jag angav adressen "127.0.0.1", vilket betyder att servern är den dator som klienten körs på. Denna metod är mycket praktisk för att testa nätverksapplikationer.
Sedan gör vi en koppling, skickar ett meddelande och kopplar ur. Precis som själva meddelandet kan du också ta IP-adressen från Edit eller från valfri strängvariabel.

Arbetet med klientprogrammet är också avslutat. Som du kan se gör Indy ett fantastiskt jobb för oss, vilket gör det möjligt för även en oerfaren programmerare att skapa sin egen nätverksapplikation.

UDP-protokollet är ganska bra för överföring textmeddelanden, det vill säga du kan organisera lokala chattar och liknande. Jag bestämde mig för att ge ett exempel på det enklaste arbetet med UDP i Delphi.

Steg-för-steg-instruktion:

Jag gav ett exempel, men förlåt mig, jag skrev inte ner varje rad, för... Jag ser inget komplicerat och vem som helst kan lista ut det.

Om något är oklart kan du faktiskt ställa en fråga till mig. Och här är den faktiska koden:

använder
Windows, meddelanden, SysUtils, varianter, klasser, grafik, kontroller, formulär,
Dialoger, StdCtrls, IdUDPServer, IdBaseComponent, IdComponent, IdUDPBase,
IdUDPClient, IdSocketHandle;

typ
TForm1 = klass(TForm)
IdUDPClient1: TIdUDPClient;
IdUDPServer1: TIdUDPServer;
Knapp1: TBnapp;
Etikett1: TLabel;
procedure FormCreate(Avsändare: TObject);
procedure FormClose(Avsändare: TObject; var Action: TCloseAction);
procedure Button1Click(Avsändare: TObject);
procedur IdUDPServer1UDPRead(ATråd: TIdUDPListenerThread; AData: TBytes;
ABinding: TIdSocketHandle);
privat
(Privata deklarationer)
offentlig
(Offentliga deklarationer)
slutet;

var
Form1: TForm1;

($R *.dfm)
[b]//Procedur för att skicka ett meddelande
procedure TForm1.Button1Click(Avsändare: TObject);
Börja
Prova
IdUDPClient1.Active:= Sant;
IdUDPClient1.Host:= "localhost";
IdUDPClient1.Connect;
om IdUDPClient1.Connected då
Börja
IdUDPClient1.Send(TimeToStr(Time));
Label1.Caption:= "ok";
slutet;
IdUDPClient1.Active:= False;
Beep;Beep;Beep;
bortsett från
MessageDlg("Något gick fel =(", mtError, , 0);
slutet;
slutet;
[b]
//På av. UDP-server vid start och stängning av formuläret
procedure TForm1.FormClose(Avsändare: TObject; var Action: TCloseAction);
Börja
IdUDPServer1.Active:= False;
slutet;

procedure TForm1.FormCreate(Avsändare: TObject);
Börja
IdUDPServer1.Active:= Sant;
slutet;

[b]//Serverreaktionsprocedur vid mottagning av data
procedur TForm1.IdUDPServer1UDPRead(ATråd: TIdUDPListenerThread;
AData: TBytes; ABinding: TIdSocketHandle);
Var
i:Heltal;
s:Sträng;
Börja
s:= "";
Prova
i:= 0;
medan (AData[i] 0) gör
Börja
s:= s + chr(AData[i]);
i:= i + 1;
slutet;
till sist
Label1.Caption:= s;
slutet;
slutet;

Serge Dosyukov Mike Pham

Den här artikeln visar hur du skapar en fristående webbtjänst med Indy-kitet och Delphi 7, och hur du använder Indy-kitet för att stödja Delphi 7 SOAP-baserade webbtjänster. Bakom ytterligare information För information om hur du skapar webbtjänster, se Nick Hodges utmärkta artikel på Borland community: Shakespeare on the Web.

Förr eller senare kan du behöva skapa en server som är en fristående HTTP-server och som stöder webbtjänster. Till exempel kanske du vill skapa en SOAP-baserad applikationsserver för en n-tier applikation byggd med Delphi.

Introduktion

Delphis onlinehjälp ger utmärkt sekventiell instruktion om hur man skapar en webbtjänst, MIDAS-server (COM, DCOM-modell), men det finns praktiskt taget ingen information om att skapa en fristående n-tier MIDAS-applikation baserad på SOAP-protokollet.

Tidigare publicerad av Dave Nottage. Den här artikeln beskrev idén om hur man skapar en webbtjänst i Delphi 6 med SOAP-stöd och möjligheten att publicera SOAP-gränssnitt för Datamodulen, det vill säga den här artikeln tillät dig att lära dig hur du skapar din egen n-tier MIDAS-system.

Borlands Delphi 7 och det nya Indy kitet har inbyggt stöd för denna funktionalitet.

Men trots inbyggt stöd är denna funktion inte dokumenterad.

De senaste inläggen på Borlands nätverkskonferens och sökning på webben med en Google-server har gjort det möjligt för författarna att utveckla ett sätt att konvertera befintlig kod från Delphi 6 till Delphi 7. Men allt har sin tid.

huvudtanken

Den här artikeln är den första delen av en serie i tre delar. Den beskriver de viktigaste bestämmelserna. Den andra och tredje delen kommer att ägnas åt några problem och sätt att lösa dem. Låt oss börja beskriva huvudidén.

  • vara en fristående HTTP-server;
  • använd Indy som plattform;
  • stödja publicering via SOAP-protokoll;
  • kunna publicera SOAP DataModules, vilket gör att du kan skapa din egen n-tier server baserad på SOAP/HTML.

HTTP-server och SOAP

Många känner till Indy och har använt THTTPServer-komponenter tidigare. Det är lätt att lägga in den här komponenten på en ansökningsblankett, men hur får man den att stödja SOAP? I katalogen "C:Program FilesBorlandDelphi7SourceIndy" kan du hitta filen IdHTTPWebBrokerBridge.pas. Detta är precis vad du behöver.

Den här filen är inte en del av Indys körbara fil, så du måste inkludera den i ditt nuvarande projekt som en standardprojektfil. (För att kompilera projektet behöver du också filen IdCompilerDefines.inc.) Dessa filer måste kopieras till den aktuella projektkatalogen. Kodändringar kan behövas för att öka hastigheten, så det är bäst att hålla dessa filer åtskilda från Indy-distributionen.

Följande beskriver implementeringen av en ersättningskomponent från THTTPServer, utökad för att stödja SOAP-paket, kallad TIdHTTPWebBrokerBridge. Den här konstruktionen är en klass som ärver från TCustomHTTPServer och stöder grundläggande begäranbindning.

Eftersom denna klass inte är tillgänglig från paletten, måste du definiera den som ett vanligt objekt när du kör din kod.

Detta objekt kan användas på exakt samma sätt som en vanlig THTTPServer, med undantag för de ytterligare egenskaper som möjliggör drift med SOAP.
Men låt oss först titta på att förbereda den nödvändiga koden.

WebBroker och Indy

För dig som har skapat webbtjänster tidigare vet du att du använder WebBroker. Delphi 7, liksom Delphi 6, använder WebBroker-arkitekturen för att stödja SOAP.

Därför måste du skapa en modul TWebModule och placera följande tre komponenter i den: THTTPSoapDispatcher, THTTPSoapPascalInvoker och TWSDLHTMLPublish. Alla är tillgängliga från fliken WebServices i komponentpaletten. Efter att ha länkat SOAPDispatcher med SOAPPascalInvoker är ansökningsformuläret klart. Slutresultatet bör vara ungefär som det som visas i följande figur:

(modul uWebModule.pas)

Det är bäst att lämna allt som det är, eftersom det inte finns något behov av att ändra eller köra någon anpassad kod för detta formulär.

WebModule och Indy

Låt oss gå vidare till den andra delen av koden som behövs för att implementera HTTP-servern.

Som du kan se har TIdHTTPWebBrokerBridge en RegisterWebModuleClass-metod, som låter dig registrera din egen WebModule och göra den tillgänglig för servern.

Efter att ha skapat fServer-serverobjektet behöver du alltså bara anropa klassen fServer.RegisterWebModuleClass (TwmSOAPIndy).

Notera. I en normal implementering av TIdHTTPWebBrokerBridge kommer ett TwmSOAPIndy-objekt att skapas varje gång en begäran tas emot. Uppenbarligen är detta inte nödvändigt. Därför kan klassen modifieras för att ge permanent skapelse av detta objekt så länge som Server-objektet finns. Det rekommenderas att du hänvisar till dokumentationen för klassimplementering för mer information.

Är servern klar?

Indy-komponenter som används i Delphi 6.

Utöver grundläggande internettjänster och protokoll finns det ett brett utbud av tilläggstjänster, vars möjligheter ofta används av internetutvecklare. Dessutom är möjligheten att visa information med en webbläsare inte alltid en acceptabel lösning för internetapplikationer. I det här fallet är det rimligt att använda internetinfrastrukturen för datautbyte och visa information med mer komplexa klientapplikationer utvecklade till exempel i Delphi.

Låt oss säga att du behöver implementera specialiserad serverlogik som inte ingår i vanliga webbservrar. För att lösa denna klass av problem inkluderar Delphi Internet Direct (Indy)-biblioteket från Nevrona Designs (http://www.nevrona.com/Indy/). Detta bibliotek, utvecklat specifikt för Borland Delphi, har redan åtta versioner, varav den senaste ingår i ny version Delphi. Uppsättningen av komponenter är uppdelad i tre grupper: klient (Indy Client), server (Indy Servers) och auxiliary (Indy Misc).

Indy-klienter och Indy-servrar

Majoritet Indy komponenter Klient- och Indy-servrar är par som motsvarar klient- och serverdelarna av protokoll och tjänster (med undantag för enskilda, huvudsakligen serverbaserade komponenter som TunnelMaster och TunnelSlave), och tillåter användning av protokoll som TCP/IP, UDP, NNTP, SMTP, FTP, HTTP, samt ECHO, FINGER, WHOIS, etc. tjänster.

Indy-klientkomponenter skrivs med sockets. Klientsidans uttag kräver en anslutning till servern. Om anslutningen upprättas kan klienten och servern börja utbyta meddelanden. Dessa meddelanden är av en annan karaktär, men vanligtvis sker utbytet med ett specifikt protokoll (till exempel HTTP)

TIdTCPClient och TIdTCPServer

Dessa komponenter används för att stödja ett av huvudnätverksprotokollen - TCP (Transmission Control Protocol), och är också basklasserna för TIdSMTP- och TIdFTP-komponenterna. Klassen TIdTCPServer har en ThreadMgr-egenskap som är noll som standard. Om ThreadMgr är noll när TIdTCPServer är aktiverad kommer klassen TIdThreadMgrDeafault att skapas implicit. Annars används den installerade processhanteraren.

TIdUDPClient och TIdUDPServer

Dessa komponenter används för att stödja nätverksprotokoll UDP (User Datagram Protocol) och är också basklasserna för ett antal andra Indy-komponenter.

TIdChargenServer

Komponenten används för att generera slumpmässiga symboler, vanligtvis för teständamål.

TIdDayTime och TIdDayTimeServer

Komponenterna används för att tillhandahålla tidsservice. Klienten begär och servern rapporterar aktuellt datum och tid.

TIdDNSResolver

Detta är en klientkomponent som betjänar förfrågningar från en DNS-server (Domain Name Service). DNS-serverfrågor är utformade för att ersätta en dators namn med dess IP-adress. TIdDNSResolver är en ättling till klassen TIdUDPClient.

TIDDICTServer

En serverkomponent som stöder Dictionary Server Protocol (DICT), en ordbok på serversidan baserad på TCP-protokollet som tillåter en klient att få åtkomst till en ordbok för naturligt språk.

TIDDISCARDServer

Serverkomponenten som stöder postservern. Inspelningarna kan användas som ett felsöknings- och mätverktyg. Registertjänsten lämnar helt enkelt över all data till den som är villig att ta emot den.

TI dEcho och TI deCHOServer

Komponenterna är utformade för att tillhandahålla en svarstjänst, som vanligtvis används för att kontrollera nätverkets tillstånd. Klienten skickar ett textmeddelande till servern, servern returnerar meddelandet till klienten. Om meddelandet är förvanskat fungerar nätverket fel.

TIdFinger och TIdFingerServer

Komponenterna är utformade för att tillhandahålla ett protokoll som tillåter en användare att fråga data angående närvaron av andra användare på systemet. Vissa servrar hanterar sådana klientförfrågningar. Genom att använda detta par av komponenter kan du betjäna klientförfrågningar som bestämmer närvaron av andra användare på systemet.

Komponenten inkluderar fullt stöd för filöverföringsprotokollet - FTP (File Transfer Protocol). Passiv och aktiv dataöverföring stöds, liksom operationer som GET och PUT, radering av kataloger, erhållande av kvoter, fil- och katalogstorlekar. TI dFTP använder klassen TIdSimpleServer för att fungera. När en FTP-filöverföring pågår öppnas en sekundär TCP-anslutning för dataöverföring och stängs när data har överförts. Denna anslutning kallas en "datalänk", unik för varje fil som överförs.

TIdGopher och TIdGopherServer

Dessa komponenter är utformade för att tillhandahålla ett nätverksprotokoll som har ersatts Nyligen från WWW ( World Wide Web) HTTP-protokoll. Servern som implementerar detta protokoll tillhandahåller ett hierarkiskt distribuerat dokumentflödesstödsystem. Ett exempel på användning av detta par av komponenter, som finns i katalogen demosindyGopherClient och demosindy GopherServer, visar hur du med detta protokoll kan tillhandahålla information om filer på din dator, inklusive stängda sådana, på ett lokalt nätverk.

TIdHostNameServer

En serverkomponent utformad för att skicka det lokala servernamnet till klienter.

TIdHTTP och TIdHTTPServer

Komponenterna används för att tillhandahålla HTTP-nätverksprotokollet (versionerna 1.0 och 1.1 stöds, inklusive GET-, POST- och HEAD-operationer). Dessutom tillhandahålls stöd för autentisering och användning av proxyservrar. Serverkomponenten används för att tillhandahålla tjänster till en annan webbserver som stöder ett givet protokoll. TIdHTTPServer underlättar implementeringen av funktioner som cookies, tillståndshantering etc.

TIdIcmpClient

En klientkomponent utformad för att tillhandahålla Internet Control Message Protocol (ICMP), som används för att utföra ping-operationer och nätverksspårning.

En klientkomponent utformad för att tillhandahålla Post Office Protocol (POP), inklusive stöd för MIME-kodning och avkodning, och multibyte-teckenöverföring.

TIdIMAP4Server

En serverkomponent utformad för att stödja IMAP-operationer (Internet Message Access Protocol) på servern. Protokollet låter dig söka efter meddelanden E-post på servern. Skillnaden mellan IMAP- och POP-protokollen är att POP-protokollet kräver extra minne för att lagra data, och IMAP-protokollet kommer åt servern istället för klientmaskinen. IMAP4 skapades för att ersätta POP3, men POP3 är fortfarande en allmänt använd standard till denna dag.

TIdIRCServer

En serverkomponent utformad för att stödja de vanligaste tjänsteoperationerna på Internet, vanligen kallad chatt. Komponenten ger grundläggande byggklossar för IRC-server (Internet Relay Chat).

TIdMappedPortTCP

En serverkomponent utformad för att skapa mappade portar, som ofta används i proxyservrar. Metoderna för den här komponenten låter dig mappa en port till en annan. Till exempel kan port 80 mappas till port 3000, och alla förfrågningar till den första porten (port 80) skulle vidarebefordras till den andra porten (port 3000).

TIdNNTP och TIdNNTPServer

Dessa komponenter krävs för att stödja Network News Transfer Protocol (NNTP) som används i nyhetstjänster. Klientkomponenten inkluderar stöd för MIME-kodning och avkodning, samt stöd för multibyte-tecken och alternativa kodningar. Serverkomponenten låter dig skapa nyhetsservrar. Det är viktigt att notera att TIdNNTPServer inte är en fullfjädrad nyhetsserver, utan en komponent som tillhandahåller den grundläggande funktionaliteten för en sådan server.

TIdQOTD och TIdQOTDServer

Komponenterna används för att tillhandahålla tjänsten Dagens offert. Klientkomponenten ansluter till serverkomponentinstansen för att få den dagliga offerten. Varje serverinstans innehåller en unik referensdatabas.

En klientkomponent designad för användning i SMTP-applikationer (Simple Mail Transfer Protocol) som ger stöd för autentisering, MIME-kodning och avkodning och stöd för flerbytetecken.

En klientkomponent utformad för att tillhandahålla SNTP (Simple Network Time Protocol) - en tidstjänst. Kan användas för att ansluta till vilken tid som helst tjänst för att bestämma aktuella datum och tid.

TIdSimpleServer

Serverkomponent som ger en lättviktig TCP-server. Låter dig organisera en punkt-till-punkt-anslutning. Den används för att skapa servrar med en enda användare, det vill säga den kan bara betjäna en anslutning åt gången. Till skillnad från TIdTCPServer-komponenten skapar den inte sekundära processer när man väntar på förfrågningar från klienter och när man bearbetar dessa förfrågningar. Med andra ord, om servern betjänar en begäran från en klient, och vid den tidpunkten en annan klient kontaktar den för att ansluta, kommer den att blockeras till slutet av behandlingen av den första begäran.

TIdTelnet och TIdTelnetServer

Klientkomponenten används för att organisera fjärrsessioner på en annan dator, inklusive konsolförhandlingar och autentisering. Kommunikationsprotokollet förutsätter närvaron av en person som interagerar interaktivt med servern. Klientkomponenten har inte bildskärmsstöd eller terminalemulering, utan tillhandahåller helt enkelt en anslutning till serverdelen. Vanligtvis används TIdTelnetServer-serverprotokollet för att organisera fjärrdatabaser med ett textgränssnitt för interaktiv interaktion med klienter.

TIdTime och TIdTimeServer

Klientkomponenten är ett alternativ till TIdSNTP-komponenten för att bestämma tid. Det är viktigt att notera att formaten för de två protokollen är olika. TIdTime är baserat på RFC 868-formatet (returnerar tiden i den interna UNIX OS-standarden, utför alla nödvändiga konverteringar). Serverkomponenten fungerar likadant som DayTime-servern. Kan användas för att implementera en tidstjänst på lokal dator. Ingen ytterligare kod krävs, skapa bara en instans av TIdTimeServer som returnerar tiden för serverdatorns interna klocka.

TIdTrivialFTP och TIdTrivialFTPServer

Dessa komponenter är nödvändiga för att organisera ett enkelt filöverföringsprotokoll. Klientkomponenten i detta protokoll används för att ansluta till en instans av motsvarande serverkomponent. Protokollet är avsett för privata, lätta, lokala fall av filöverföring, till exempel i lokala nätverk eller för att ladda (ladda upp) routingtabeller till routrar. På grund av de försvagade egenskaperna hos detta protokoll rekommenderas inte användningen av det när du använder autentiseringsalgoritmer eller andra säkerhetsmekanismer. Huvudsyftet med detta protokoll är att överföra filer till en hårdvaruenhet i syfte att modifiera den.

TIdTunnelMaster och TIdTunnelSlave

Servertunnelkomponenter används i proxyservrar för att organisera flera logiska anslutningar över en fysisk (tunnel). Dessa klasser kan användas för olika ändamål, till exempel för att organisera en hemlig anslutning över icke-hemliga kanaler.

TIdWhois och TIdWhoIsServer

Den här klientkomponenten ansluter till vilken standard Whois-server som helst, vilket gör att du kan få information om domäner. Serverkomponenten tillhandahåller de grundläggande funktionerna hos en NIC-server.

Indy Övrigt

Palettsidan Indy Diverse komponenter inkluderar BASE64, UUE, Quoted Printable och andra vanliga e-postkommunikationsformat, kodare (MD2, MD4 och MD5) för kryptografistandarder som används för att lagra lösenord och elektroniska signaturer i en oåterkallelig (svårt att tyda) form, såväl som många andra användbara komponenter och verktyg som ofta används i utvecklingen av internetapplikationer.

TIdAntiFreeze

På grund av de blockbaserade algoritmerna för Indy-komponenter verkar det ofta som att applikationen har fastnat medan anslutningen fungerar. För att eliminera användningen av sekundära processer (trådar) när du organiserar kommunikation för att förhindra att applikationen fryser, räcker det att placera den angivna komponenten på formuläret.

Komponenten fungerar genom att analysera förfrågningar från TCP/IP-protokollstacken och skicka meddelanden till applikationen under fördröjningen när externa anslutningar blockeras, vilket skapar en illusion av att köra kod. Eftersom komponenten endast påverkar blockerade anslutningar för huvudprocessen, krävs inte användning av TIdAntiFreeze i applikationens sekundära processer. Tänk på att TIDAntiFreeze-komponenten saktar ner anslutningarna eftersom huvudprocessen periodvis avbryts för att bearbeta meddelanden. Av detta följer att man måste se till att applikationen som utvecklas inte lägger för mycket tid på att bearbeta meddelanden, inklusive OnClick, OnPaint, OnResize, etc. Till viss del kan detta kontrolleras genom egenskaperna för klassen TIdAntiFreeze. Användningen av denna komponent är inte obligatorisk, men den låter dig lösa problemet med att synkronisera anslutningar med applikationens visuella gränssnitt.

TIdDateTimeStamp

En klass för att utföra matematik för datum och tid relaterad till det faktum att internetprotokoll använder olika datum- och tidsformat; dessutom kan klienter och servrar finnas i olika tidszoner.

TIdIPWatch

Det är en timerbaserad komponent som ständigt övervakar förändringar i datorns IP-adress. Komponenthändelser inträffar när en förändring upptäcks. Denna komponent används vanligtvis för att upptäcka om en dator är ansluten till Internet eller något annat nätverk. Ändringen av IP-adress i den här situationen kan uppstå på grund av att IP-adressen tilldelas av DHCP-servern (Dynamic Host Configuration Protocol) vid anslutning till det nya nätverket.

TIdLogDebug

Syftet med den här komponenten är att fånga upp händelser från vilken klient eller serverkomponent som helst och placera en registrering av händelsen i specificerad fil. Den här komponenten är mycket användbar för att felsöka Indy-komponenter.

TIdMessage

Komponenten används i kombination med andra komponenter för att korrekt dekryptera eller koda meddelanden. Dessa kan vara POP-, SMTP- och NNTP-komponenter. Klassen stöder MIME-kryptering och dekryptering, multibyte-tecken och ISO-kodning.

TIdNetwork Calculator

En av få Indy-komponenter som kan användas när man bygger applikationer. Nätverkskalkylatorn kan användas för att utföra beräkningar på IP-adresser, inklusive nätverksmasker, subnät, nätverksklasser, etc.

TIdThreadMgrDefault

Komponenten ger kontroll över sekundära processer som standard. Skapas när någon Indy-komponent som stöder processhantering inte har en instans av klassen TIdThreadManager definierad. Komponenten ger endast grundläggande funktioner för att hantera sekundära processer: skapa och förstöra dem på begäran.

TIdThreadMgrPool

En mer avancerad processhanteringskomponent än TIdThreadMgrDefault eftersom den slår samman processer snarare än att skapa eller förstöra dem på begäran.

TIdVCard

VCard är den elektroniska motsvarigheten till ett visitkort och kan innehålla ägarens personliga information och grafiska data.

TIdIMFDecoder

Designad för avkodning av Internetmeddelanden. Det är en ättling till TIdCoder-klassen, precis som alla andra kodarkomponenter. Klassen TIdCoder avkodar enligt ARPA Internet textmeddelandeformatstandard RFS-822, som föreslogs i augusti 1982, och USENET meddelandestandard RFC 1036, som föreslogs i december 1987.

Komponenten utökar TIdCoder-klassen för att tillåta detektering av RFS-822-format efter huvudkontext, vilket ger dekryptera-vid-mottagning-läge och MIME-kryptering och dekryptering. TIdIMFDecoder-komponenten används i klassen TIdMessageClient för att avkoda mottagna och sända meddelanden.

TIdQuotedPrintableEncoder

QuotedPrintableEncoder låter dig dekryptera text i det angivna formatet. Kan fungera som en fristående komponent med en specificerad kodningstyp, vilket gör att meddelanden som innehåller en ny kodningstyp kan överföras.

TIdBase64Encoder

Implementerar ytterligare en krypteringsalgoritm som gör det möjligt att överföra icke-utskrivbara tecken.

TIdUUEncoder

Implementerar en av de första krypteringsalgoritmerna, UU-kodning. Används ibland när artiklar skickas till en nyhetstjänst.

TIdXXEncoder

Det är osannolikt att denna krypteringsmetod någonsin kommer att användas. I huvudsak är detta samma UU-kodning, men med en annan krypteringstabell.

TIdCoderMD2

Komponenter med olika typer av MD (Message Digest) krypteringsalgoritm. De är alla shuffle-baserade, enkelriktade och har inga dekrypteringsalgoritmer.

Komponenter av protokollklienter och servrar kan användas för att utveckla server- och klientinternetapplikationer, tillsammans med eller istället för grundläggande (ClientSocket, ServerSocket) och andra komponenter från Internet- och Fastnet-paletten. Indy-komponenter använder inte WebBroker-arkitekturen och implementerar lågnivåstöd för Internetprotokoll och tjänster direkt i källkoden ( källkoderär bifogade).

TIdConnectionInterceptOpenSSL och TIdServerInterceptOpenSSL

SSL-protokollet - Secure Sockets Layer, som säkerställer sekretess och tillförlitlighet för kommunikation mellan två applikationer, har två lager. På den låga nivån av ett flerskiktstransportprotokoll (som TCP) är SSL ett inspelningsprotokoll och används för att kapsla in olika protokoll på högre nivå. Fördelen med SSL är att det är ett oberoende applikationsprotokoll, men ett protokoll på högre nivå kan användas ovanpå SSL.

SSL tillhandahåller kommunikationssäkerhet, som har tre huvudfunktioner: tillhandahålla en konfidentiell anslutning; kryptering med offentlig nyckel(används för att bekräfta adressatens äkthet); stöd för tillförlitlighet i dataöverföring.

  • Symmetrisk kryptografi används för att kryptera data (t.ex. DES, RC4, etc.).
  • Digital signatur tillhandahålls med asymmetrisk kryptering med publik nyckel (till exempel RSA, DSS, etc.).
  • Tillförlitlighet för kommunikation, meddelandetransport inkluderar kontroll av meddelandets integritet genom MAC-korrigeringskoder, säkra hashfunktioner (t.ex. SHA, MD5, etc.) med hjälp av MAC-beräkningar.

I kombination med HTTP och serverautentisering ger SSL nödvändiga funktioner kryptering och bibehåller vidare den etablerade anslutningen, dubbelkontroll av webbserverns äkthet, etc. Det är viktigt att förstå att SSL endast skyddar kommunikation under dataöverföring och inte ersätter andra säkerhetsmekanismer.

Komponenterna TIdConnectionInterceptOpenSSL och TIdServerInterceptOpenSSL tillhandahåller anslutningar på både klientsidan och serversidan med SSL-protokollet. Det bör noteras att komponenterna TIdConnectionInterceptOpenSSL och TIdServerInterceptOpenSSL endast är tillgängliga i Delphi 6 och inte i Kylix. Detta beror på komplexiteten i protokollet, som i fallet med en Windows-implementering är baserat på operativsystemets funktioner.

Exempel på användning av Indy-komponenter finns i /Delphi6/Demos/Indy-katalogerna. Totalt innehåller Indy-biblioteket i version 8.0 69 komponenter. Det anges att i version 9.0 kommer det angivna biblioteket att innehålla 86 komponenter. Alla komponenter är enhetliga och ingår i både Delphi 6 och Kylix, vilket gör att de kan användas för att utveckla plattformsoberoende applikationer. Alla Indy-komponenter stöder multithreading.

Indy-komponenterna implementerar nästan all funktionalitet som finns i Internet- och Fastnet-komponenterna, vilket tydligt framgår av tabellen.

Fastn et komponenter Indy komponenter Syfte med komponenter
1 TserverSocket, TClientSocket TIdTCPserverSocket, TIdTCPClientSocket Interaktion mellan två datorer (klient och server) med hjälp av TCP/IP-protokollet
2 TNMDayTime TIdDayTime, TIdDayTimeServer Fråga servern för aktuell tid
3 TNMEcho TIdEcho, TIdEchoServer Används för att kommunicera med svarsservern
4 TNMFinger TIdFinger, TIdFingerServer Används för att hämta information om användaren från en sökserver på Internet
5 TNMFTP TIdFTP, TIdTrivialFTP, TIdTrivialFTPServer Tillhandahåll filöverföring med FTP-protokoll
6 TNMHTTP TIdHTTP, TIdHTTPServer Använd HTTP-protokoll för datautbyte
7 TNMMsgServ, TNMMsg Används för att överföra enkla textmeddelanden från klient till server
8 TNMNNTP TIdNNTP, TIdNNTPServer Stöder datautbyte med nyhetsserver
9 TNMPOP3 TIdPOP3 Används för att ta emot e-post från en e-postserver som använder POP3-protokollet
10 TNMSMTP TIdSMTP Används för att skicka e-post via Internet-e-postserver
11 TNMSrm, TNMSrmServ Sänder binär data som skrivits till en ström med TCP/IP-protokollet
12 TNMUDP TIdUDP, TIdUDPServer Överför data med UDP-protokollet
13 TpowerSock, TNMGeneralServer Komponentinkapslade klasser som är grunden för att skriva dina egna klienter (Powersock) och servrar (NMGeneralServer)
14 TNMUUPocessor TIdUUEncoder, TIdUUDecoder Utför omkodning binära filer till MIME- eller UUENCODE-format
15 TNMURL Konverterar strängar till HTML-format och utför omvänd omkodning

Undantagen är klasser som TNMMsgServ, TNMMsg, TNMStrm, TNMStrmServ, TpowerSock, TNMGeneralServer, TNMURL, som antingen implementerar föråldrade protokoll eller har funktionalitet implementerad i en stor grupp av alternativa klasser.

Men till skillnad från sina föregångare - Internet- och Fastnet-komponenterna, innehåller Indy rikare serverkomponenter och komponenter för dataomkodning och kryptering, samt autentiseringsstöd (Indy Misc-palett). Som framgår av tabellen ovan tillhandahålls huvudprotokollen och tjänsterna inte bara av klienten utan också av serverkomponenter. Dessa är tidstjänster, svarstjänster, inhämtning av användarinformation, samt HTTP, NNTP, UDP-protokoll och till och med den enklaste versionen av FTP.

Några exempel på användning av Indy-komponenter

I Indy-komponenter som finns i Delphi definieras IP-adressen i Host-egenskapen, vanligtvis endast i klientapplikationer. Serverbaserade komponenter har metoder som gör att du kan starta eller stoppa polling av motsvarande port - till exempel att ändra egenskapen Active för IdTCPServer-komponenten startar eller stoppar polling av motsvarande port. När anslutningen mellan klienten och servern är upprättad kan dataöverföringen börja.

Indy-komponenter lägger stor vikt vid säkerhet och tillförlitlighet vid arbete med data. Till exempel har IdTCPClient-komponenten Connect och Disconnect metoder. Använda en programmeringsteknik som koden nedan från klientsidan:

Med TCPClient börja Connect; försök lstMain.Items.Add(ReadLn); slutligen Koppla bort; slutet; slutet;

och använda egenskapen Connection som skickas som en parameter till AThread-instansen av klassen TIdPeerThread från serversidan:

Med AThread.Connection börjar WriteLn("Hej från Basic Indy Server-server."); Koppla ifrån; slutet;

du kan räkna med antingen normal utförande av anslutningen eller korrekt felhantering.

Notera ReadLn- och WriteLn-metoderna för motsvarande klasser - de liknar standard Pascal I/O-satser. Detta är en hyllning till UNIX-programmeringstekniken, där de flesta systemoperationer utförs genom att läsa och skriva till motsvarande filer.

Precis som Fastnet-komponenter har Indy-komponentklasser händelser som kan användas för att tillhandahålla händelsehantering. Du kan till exempel ordna att ett meddelande visas på ett formulär när du ansluter till en klient:

Procedur TForm1.IdECHOServer1Connect(AThread: TIdPeerThread); begin lblStatus.caption:= "[ Betjänar klient ]"; slutet;

Indy tillhandahåller komponenter som implementerar protokoll med klient- och serverdelar som är unika för detta bibliotek. Komponenterna TIdGopherServer och TIdGopher, tack vare metoderna GetExtendedMenu, GetFile, GetMenu, GetTextFile på klientsidan och ReturnGopherItem, SendDirectoryEntry på serversidan, hjälper till att visa filer olika typer, inklusive de som är markerade som dolda, såväl som kataloger på fjärrdator(liknande vad dir *.*-kommandot gör i operativ system MS-DOS).

Med hjälp av IdSMTP- och IdMessage-komponenterna kan du enkelt skapa din egen webbapplikation som kan skicka e-post med SMTP-protokollet.

I det här fallet är IdMessage-klassen (en av 23 komponenter från Indy Misc-sidan) ansvarig för att generera meddelandet, som följer av dess namn, och IdSMTP är för att organisera anslutningen till e-postservern.

Tekniken som används i Indy använder låsande läs- och skrivoperationer. Alla Connect-operationer som används i Indy väntar på att anslutningen ska slutföras. När du arbetar med Indy-klientkomponenter behöver du vanligtvis göra följande:

  • begära en anslutning till servern;
  • göra läs- och skrivförfrågningar till servern (beroende på typen av server utförs steget en gång eller upprepas många gånger);
  • avsluta anslutningen till servern och koppla från.

Indy-komponenter är designade för att ge en ultrahög abstraktionsnivå. Invecklarna och detaljerna i TCP/IP-stacken är dolda för programmeraren så att han kan fokusera på uppgiften.

Följande lilla exempel visar en typisk klientbönsession:

Med IndyClient börjar Host:= "zip.pbe.com"; // Värd att anropa Port:= 6000; // Port för att anropa servern på Connect; prova // Din kod går här äntligen Koppla bort; slutet; slutet;

I exemplet, även om anslutningen till servern inte upprättas, kommer anslutningen att avslutas på ett elegant sätt på grund av användningen av try-finally-satsen.

Indys serverkomponenter beskriver en mängd olika servermodeller som kan användas beroende på dina behov och det protokoll du använder.

TIdTCPServer är den mest använda serverkomponenten, som skapar en sekundär process oberoende av huvudapplikationsprocessen. Den skapade processen väntar på inkommande förfrågningar från potentiella klienter. En individuell sekundär process skapas för varje klient vars begäran den svarar på. Händelser som inträffar under underhållsprocessen är relaterade till sammanhanget för motsvarande processer.

Med andra ord, för varje klientanslutning använder klassen TIdTCPServer en unik sekundär tråd genom att anropa den trådens OnExecute-händelsehanterare. Den formella parametern för OnExecute-metoden är en referens till en instans av klassen Athread som motsvarar den skapade tråden. Connection-egenskapen för den här klassen är en referens till klassen TIdTCPConnection, vars instans skapas för att bearbeta klientförfrågan. TIdTCPConnection stöder läsning och skrivning över anslutningen, samt upprättande och avslutande av en kommunikationssession.

UDP-protokollet fungerar utan att först upprätta en anslutning till servern (varje skickat paket är en oberoende uppsättning data och inte en del av en större session eller anslutning). Medan TIdTCPServer skapar separata trådar för varje anslutning, använder TIdUDPServer antingen en huvudtråd eller en enda sekundär tråd som hanterar alla UDP-protokollförfrågningar. När TIdUDPServer är aktiv skapas en tråd för att lyssna efter inkommande UDP-paket. För varje paket som tas emot höjs en OnUDPRead-händelse antingen på huvudtråden eller i kontexten av lyssningstråden, beroende på värdet på egenskapen ThreadedEvent. När ThreadedEvent utvärderas till False inträffar händelsen på huvudtråden, annars inträffar den på lyssnartråden. Medan händelsen bearbetas blockeras andra serveroperationer. Därför är det viktigt att se till att OnUDPRead-procedurer körs så snabbt som möjligt.

Om du behöver skapa en ny klientapplikation för en befintlig server med hjälp av ett befintligt protokoll, är ditt jobb enbart att utveckla och felsöka klientapplikationen. Däremot när man ska utveckla både klient och serverapplikation Oavsett om vi använder ett befintligt eller nytt protokoll, står vi inför det klassiska problemet med "kyckling och ägg". Var ska man börja programmera - från klienten eller från servern?

Självklart måste både klienten och servern skapas så småningom. För många applikationer, särskilt de som använder ett textbaserat protokoll (som HTTP), är det lättare att börja bygga applikationen genom att designa servern. Och för felsökning finns det en bekväm klient som redan finns. Detta är en Telnet-konsolapplikation som är tillgänglig på både Windows och UNIX.

Om du skriver konsolen telnet kommando 127.0.0.1 80 med IP-adressen för den lokala datorn och portnummer 80, som används som standard av webbservrar, då kommer applikationen att svara med texten som visas i Fig. 6, för Windows 2000 OS och IIS 5.0.

För att skapa den enklaste servern med Indy-komponenter behöver du:

Om du behöver designa en server som inte bara korrekt informerar sina klienter när anslutningen bryts, utan också ger dem information om felsituationer som har inträffat, använd try-except-satsen istället för try-finally - till exempel som visas i följande exempel:

Procedur TDataModule1.IdTCPServer1Execute(AThread: IdPeerThread); var s: String; börja med AThread.Connection försök försök s:= ReadLn; // Utför serverns uppgift här // om inget undantag görs, // skriv ut serverns svar WriteLn(s); förutom på e: Exception do begin WriteLn(e.Message); end; //on end; //försök utom att slutligen Koppla bort; slut; slut;

Detta lilla exempel visar stegen för att skapa en enkel textserver, samt hur man felsöker den.

Servern som beskrivs ovan är ett typiskt exempel på organisationen av modern distribuerad datoranvändning.

Funktioner för att skapa flerskiktsapplikationer

På senare tid har flera servrar använts alltmer för att tillfredsställa klientförfrågningar. En server av denna typ, som har mottagit en klientförfrågan och delvis förberett den för vidare bearbetning, kontaktar en annan server och skickar den eller de transformerade förfrågningarna till den. Den andra klassens server kan i sin tur kommunicera med andra servrar. Således kan vi prata om en serverarkitektur med flera nivåer.

Därefter kommer vi att skapa en dataåtkomstserver vars syfte är att returnera data från databasen. Den här servern läser eller skriver inte direkt till databasfilerna. Istället kommunicerar den med databasservern på jakt efter den data som klienten kräver.

Så vi börjar utveckla en applikation med en arkitektur i tre nivåer. För att skapa en databasserver med Indy-komponenter behöver du:

  1. Skapa ett nytt projekt.
  2. Placera på huvudform projektinstans av TIdTCPServer-komponenten från paletten Indy Servers.
  3. Ställ in DefaultPort-egenskapen för klassinstansen TIdTCPServer1 till 6001 (det rekommenderas att tilldela stora värden för att undvika duplicering av portnummer över olika applikationer), och ställ in egenskapen Active till true.
  4. Lägg till en ny modul till projektet genom att välja Arkiv | Nytt | Data Module, och placera instanser av SQLConnection- och SQLDataSet-komponenterna på den från fliken dbExpress på komponentpaletten.
  5. Ställ in egenskapen ConnectionName för klassen SQLConnection till IBLocal och LoginPrompt till False. Om du inte har konfigurerat IBLocal på databasen werknemer.gdb, slutför denna procedur först.

Hej alla!

Vid utvecklingen av nästa webbprojekt uppstod uppgiften - att implementera klientprogramvara i Delphi, som skulle överföra data till servern med POST-metoden. Applikationen måste överföra text och ladda upp filer till webbservern.

Implementering av sådan datasändning med hjälp av språk på serversidan webbutveckling(till exempel PHP) är ganska enkelt, men om du behöver skriva applikationsbaserad, fleranvändarprogramvara som interagerar med servern, så är det lite mer komplicerat. Metoden att direkt ansluta till databasen och via FTP till servern från Delphi är inte längre nödvändig eftersom det är inte säkert, inte tillförlitligt (byta lösenord, anslutningsdata, etc.) och skapar ytterligare. ppå klientsidan. För att lösa problemet bestämde jag mig för att skriva skript (serverdel) i PHP som kommer att behandla inkommande POST-förfrågningar och returnera resultatet till klienten (Delphi-applikationen). Fördelarna med detta tillvägagångssätt är att alla anslutningar och databehandling sker på servern, vilket är mycket säkrare än en direkt "anslutning".

När jag började googla lämnades mycket spridd information upp, mest på forum, men allt var i bitar. En sak var säker att Indy skulle användas, nämligen IdHTTP-komponenten med POST-metoden implementerad. Faktum är att allt är enkelt, den här metoden tar två parametrar Url för en resurs och DataStream (dataström), och returnerar resultatet i textform (det kan också vara sidans HTML-kod). Huvudsaken var den korrekta bildningen av DataStream (ström av överförda data), men under vägen uppstod ytterligare fallgropar, nämligen den ryska kodningen (om den inte vore bra). Det var här det roliga började för flera timmars vandrande runt på Internet. I allmänhet, tillräckligt med prat, låt oss gå vidare till övning och implementering av programvaran.

Så programmet är enkelt. Hon måste skicka data till servern med POST-metoden, data innehåller " Rubrik " (rad), " Beskrivning » ( flerradstext) Och grafisk fil(jpg,png,gif-binära data). Servern måste acceptera denna data, bearbeta den, spara grafikfilen på servern och returnera ett svar. Som ett svar kommer vi att returnera Delphi till applikationen, samma text endast med tillagda etiketter och en länk till den nedladdade filen. Inget annat.

Låt oss börja med implementeringen av serverdelen (liknande webbplatsens API). Öppna någon textredigerare(anteckningsblock) och skriv följande kod i den:

"; ) else ( eko "Titel: Saknas"."
"; ) //Kontrollera inkommande data för närvaron av "innehålls"-fältdata if (!empty($_POST["content"]))( echo "Content: ".$_POST["content"]."
"; ) else ( eko "Innehåll: Saknas"."
"; ) //Kontrollera inkommande data för närvaron av en bifogad fil "fil" om (!empty($_FILES["fil"])) ( $finfo = pathinfo($_FILES["file"]["name" ]); / /få information om filen (namn, filtillägg, etc.) //Kontrollera filtypen i listan över tillåtna typer (IMPROVISATION:)) if (stripos("jpgpnggif",$finfo["extension"] )==0)( echo ">>>>>>>Ogiltig filtyp<<<<<<<<"; exit; //Если не допустим тип, полностью останавливаем скрипт } $fname = "files/" . "testimgfile." . $finfo["extension"]; //формируем путь и новое имя файла move_uploaded_file($_FILES["file"]["tmp_name"],$fname);//сохраняем временный файл "tmp_name" в файл $fname echo "http://".$_SERVER["HTTP_HOST"]."/".$fname; //возвращаем полный путь к файлу } ?>

notera! När du sparar (via anteckningar) måste du ange kodningen "UTF-8", annars kommer det att bli problem med att visa det kyrilliska alfabetet!

Manuset försökte ge detaljerade kommentarer. Kopiera detta skript till din webbserver, om du inte har ett kan du använda mitt skript för testet, det finns på: http://api..php

Layouten använder följande komponenter: Label, Button (2 st.), Edit (2 st.), Memo (2 st.), CheckBox, OpenDialog, IdHTTP. Ge följande komponenter namn (egenskap " namn”):

  1. Redigera (titel) – Namn=titel;
  2. Redigera (sökväg till fil) Namn = imgfile;
  3. Memo (innehåll)Namn = innehåll;
  4. Memo(resultat) – Namn = svar;
  5. Knapp(…) - Namn = chkfile;
  6. Knapp (POST) – Namn = PostBut;
  7. OpenDialog (filvalsdialog) – Namn = PictDialog;

Låt oss lämna IdHTTP1 och CheckBox1 oförändrade (trött! :)))).

För att inte av misstag" redigera» sökväg till Edit( imgfile), ställ in dess ReadOnly-egenskap till True. Likaså kl imgfile Och chkfile Ställ in egenskapen Enabled till false. Vi kommer att aktivera dem med hjälp av CheckBox, dvs. Vi ger dig möjligheten att välja om du vill ladda upp en bild eller inte.

För OpenDialog( PictDialog) måste du ställa in filtret (Filter-egenskap) enligt följande:

Själva visuella förberedelserna är över! Låt oss börja koda!

I projektet kommer vi att generera ett dataflöde med den typ som ingår i Indy - TidMultiPartFormDataStream.Även om vi stötte på implementeringsalternativ med TStream, arbetade med TidMultiPartFormDataStream – lättare!

För att göra denna typ tillgänglig för vårt projekt måste vi lägga till följande bibliotek till Användningar: IdMultipartFormData.

För CheckBox1, skapa en OnClick-händelse (genom att dubbelklicka med musen på ett objekt) och lägg till följande kod till denna händelse:

Procedur TForm1.CheckBox1Click(Avsändare: TObject); börja //aktivera eller inaktiva filsökvägselementen och dialogknapparna imgfile.Enabled:=CheckBox1.Checked; chkfile.Enabled:=CheckBox1.Checked; slutet;

Här aktiverar vi objekten imgfile Ochchkfile beroende på närvaron av en bock (om kryssrutan är markerad blir objekten aktiva).

Låt oss nu organisera bildvalet. För att göra detta, skapa en OnClick-händelse på knappen chkfile(även genom att dubbelklicka på objektet) och skriv följande:

Procedur TForm1.chkfileClick(Avsändare: TObject); börja //öppna dialogrutan och ange hela sökvägen till filen i imgfile(TEdit) om PictDialog.Execute sedan imgfile.Text:= PictDialog.FileName; slutet;

Den här händelsen utlöser en dialogruta för bildval och om användaren klickar på " Öppen", kommer sökvägen till den här filen att läggas till imgfile.

Och nu kommer vi till den sista "POST"-knappen. Skapa en OnClick-händelse för den här knappen och lägg till följande kod:

Procedur TForm1.PostButClick(Avsändare: 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"; om CheckBox1.Checked och (trim(imgfile.Text)="") sedan //kontrollerar om filen är vald eller inte börjar ShowMessage("Du måste välja en grafisk fil!"); utgång; slutet; if CheckBox1.Checked then dataPost.AddFile("file",imgfile.Text,""); //lägg till ett fält med filen response.Text:= StringReplace(idHTTP1.Post("http://api..php",dataPost),"
",#13#10,); datapost.Free; end;

Så, i ordning (även om det finns kommentarer):

Datapost – objekt av typ TIdMultiPartFormDataStream. Låter dig skapa en POST-förfrågningsstruktur som består av fält av olika typer.

dataPost . AddFormField (" titel ", titel . Text ," utf -8 "). ContentTransfer := " 8 bit "; – lägger till ett fält med namnet "title" till DataPost, ett värde från "title.Text", ställer in kodningen av den överförda datan till "utf-8" (parametern är valfri, men utan dess explicita indikation, kyrillisk sänds med frågetecken "?") och en mycket viktig metod "Content Transfer". Utan denna metod skickas data till servern " abrakadabra" Observera att fältnamnet ("titel") på sändningssidan måste matcha namnet som anges i skriptet: $_POST["titel"].

Data överförs på samma sätt som fältet "innehåll".

dataPost . Lägg till fil (" fil ", imgfile . Text ,"") – med den här raden skapar vi en ström med data från filen.

Det är allt, data genereras, allt som återstår är att överföra det till skriptet på servern och få ett svar:

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

därför att TMemo förstår inte radbrytningstaggen "
", kommer vi att använda " "-funktionen för att ersätta den med begripliga radbrytningar "#13#10".

När allt är klart, rensa minnet från DataPost-objektet med raden:

datapost.Gratis;

Även om detta i vårt exempel kommer att ske automatiskt i slutet av proceduren, men ändå...

Det faktiska resultatet av programmet på skärmen:

Således kan vi skicka så mycket data eller filer till servern som vi vill, bearbeta dessa data på servern och rapportera tillbaka till applikationen resultatet av skriptet. Det kan till och med bara vara 0 eller 1, vilket signalerar att applikationen ska reagera ytterligare.

Allt. Lycka till allihopa. Jag hoppas att informationen var användbar och att du kommer att kunna använda den.

Du kan ladda ner det färdiga exemplet och skriptet.

Fullständig modulkod:

Unit PostUnit; gränssnittet använder Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, IdBaseComponent, IdComponent, IdTCPConnection, Id IdHTTP, IdMultipartFormData, Vcl.ExtDlgs; typ TForm1 = klass(TForm) IdHTTP1: TIdHTTP; titel: TEdit; innehåll: TMemo; PostBut: TButton; svar: TMemo; Etikett1: TLabel; Etikett2: TLabel; Etikett3: TLabel; imgfile:TEdit; chkfile: TButton; Etikett4: TLabel; CheckBox1: TCheckBox; PictDialog:TOpenDialog; procedur PostButClick(Avsändare: TObject); procedure chkfileClick(Avsändare: TObject); procedure CheckBox1Click(Avsändare: TObject); privata ( Privata deklarationer ) offentliga ( Offentliga deklarationer ) slut; var Form1: TForm1; implementering ($R *.dfm) procedur TForm1.CheckBox1Click(Avsändare: TObject); börja //aktivera eller inaktiva filsökvägselementen och dialogknapparna imgfile.Enabled:=CheckBox1.Checked; chkfile.Enabled:=CheckBox1.Checked; slutet; procedure TForm1.chkfileClick(Avsändare: TObject); börja //öppna dialogrutan och ange hela sökvägen till filen i imgfile(TEdit) om PictDialog.Execute sedan imgfile.Text:= PictDialog.FileName; slutet; procedur TForm1.PostButClick(Avsändare: 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"; om CheckBox1.Checked och (trim(imgfile.Text)="") sedan //kontrollerar om filen är vald eller inte börjar ShowMessage("Du måste välja en grafisk fil!"); utgång; slutet; if CheckBox1.Checked then dataPost.AddFile("file",imgfile.Text,""); //lägg till ett fält med filen response.Text:= StringReplace(idHTTP1.Post("http://api..php",dataPost),"
",#13#10,); datapost.Free; end; end.