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 :
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: