Delphi Tips – multipart attachment IndyHTTP
Tramite la struttura dei multipart attchment via HTTP è possibile inviare o ricevere uno o più stream binari tramite una POST http, questa tecnologia è stata indtrodotta sulla scia dei protocolli per la gestione degli allegati multipli alla mail, ovviamente come core di tutto ciò c’è il ns amico TCP/IP, ma con il layer di astrazione dei multipart la vita del programmatore diciamo che si semplifica notevolmente.
Vediamo un piccolo esempio di questa usatissima tecnologia applicandola a Delphi e ai componenti standard di comunicazione messi a disposizione con questo ambiente di sviluppo.
Nell’esempio che segue faremo una post tramite un client idHTTP includendo un file in una richiesta HTTP :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
uses IdTCPConnection, IdTCPClient, IdHTTP,IdMultipartFormData; function TdmHTTP.fileProtocolRequest(URL, file_type, nome_file_completo, nome_file_relativo,cod_azienda : String; FileSize : Integer = -1): String; Var TS : TStringList; SS : TStringStream; Stringazza : String; FS : TFileStream; MultiPartFormDataStream: TIdMultiPartFormDataStream;// TMsMultiPartFormDataStream; ResponseStream: TMemoryStream; begin Result := '-1'; IdHTTP.Request.Clear; IdHTTP.Port := 80; if pos(':8080',URL) > 0 then IdHTTP.Port := 8080; if pos(':8081',URL) > 0 then IdHTTP.Port := 8081; MultiPartFormDataStream := TIdMultiPartFormDataStream.Create; ResponseStream := TMemoryStream.Create; MultiPartFormDataStream.AddFile('allegato',nome_file_completo,'pdf'); TS := TStringList.Create; SS := TStringStream.Create(''); Try Try // tramite questa tecnologia possiamo comunque usufruire dei parametri via url da passare al servizio che risponderà alla ns chiamata URL := URL + '?username=' + username + '&password=' + password ; SS.Position := 0; Try // la classe TidHTTP prevede un overload del metodo post che accetta come parametro il ns MultiPartAttchment Stringazza := IdHTTP.Post(URL,MultiPartFormDataStream); Except On E:Exception do Result := E.Message; End; If SS <> nil then Result := Stringazza;// SS.DataString; Except End; Finally Try TS.FRee; except end; Try SS.Free; except end; End; end; |
l’esempio appena portato può essere fruito da qualsiasi sistema che accetti chiamate HTTP, quindi potremmo avere dall’altra parte una Servlet JAVA , un server WEB di qualsiasi compagnia che richiede tale struttura di dato oppure ancora un server da voi sviluppato con Delphi tramite il componente TidHTTPServer.
Vediamo ora la parte server: