A continuación, les muestro ejemplos sobre cómo utilizar el componente tidHTTP de la suite de componentes
Indy. que para los que no la conozcan es un conjunto de componentes open source que soportan sockets
TCP/UDP/RAW y más de 100 protocolos de comunicaciones (
smtp,
pop3, imap, http,
ftp, etc...)
En caso de que necesiten información sobre su uso y ejemplos detallados lo tienen
aquí.
-Tips a tener en cuenta si se quiere acceder a una página segura:
En este
link tienen cómo configurar el componente idHTTP y el
idSSLIOHandlerSocketOpenSSL
Recordar que en este caso en el evento OnCreate hay que indicarle la rutas de las
librerías SSL tecleando:
IdOpenSSLSetLibPath(tpath.GetDocumentsPath); Indicar en el USES la unit IdSSLOpenSSLHeaders
Si se han cargado las librerías correctamente pueden obtener su versión de esta forma:
label1.Text:=IdSSLOpenSSL.OpenSSLVersion
y para obtener los errores en tiempo de ejecución tienen que indicar lo siguiente:
IdSSLOpenSSLHeaders.WhichFailedToLoad();
EJEMPLOS DE PROGRAMACIÓN:
-Bajar un archivo utilizando tFileStream
PROCEDURE DownloadFile(
URL, Directorio, FileName: STRING);
VAR
Stream: TFileStream;
BEGIN
IF IdHTTP1.Connected THEN
IdHTTP1.Disconnect;
IdHTTP1.HandleRedirects := true;
IdHTTP1.Request.Connection := 'keep-alive';
IdHTTP1.Request.ContentType := '';
Stream := TFileStream.Create(Tpath.Combine(Directorio, FileName), fmCreate);
TRY
Stream.Position := 0;
IdHTTP1.Get(
URL, Stream);
FINALLY
Stream.Free;
END;
END;
===
-Bajar el archivo "fichero.txt" utilizando tMemoryStream
PROCEDURE DownloadFile(
URL, Directorio, FileName: STRING);
VAR
Stream: TMemoryStream;
BEGIN
IF IdHTTP1.Connected THEN
IdHTTP1.Disconnect;
IdHTTP1.HandleRedirects := true;
IdHTTP1.Request.Connection := 'keep-alive';
IdHTTP1.Request.ContentType := '';
Stream := TmemoryStream.Create;
TRY
Stream.Position := 0;
IdHTTP1.Get('http://www.miweb.com/fichero.txt', Stream);
Stream.SaveToFile(Tpath.Combine(Directorio, FileName));
FINALLY
Stream.Free;
END;
END;
===
-Obtener una imagen de una
URL y guardarla en un tImage
PROCEDURE LoadFromURL(
URL: STRING; VAR image1: tImage);
VAR
Stream: TMemoryStream;
IdH: TIdHTTP;
BEGIN
Stream := TMemoryStream.Create;
TRY
IdH := TIdHTTP.Create(NIL);
IdH.AllowCookies := true;
TRY
IdH.Get(Trim(
URL), Stream);
EXCEPT
// Error al descargar la imagen
// .. Volcarlo al log
END;
Stream.Position := 0;
image1.bitmap.loadfromstream(Stream);
FINALLY
IdH.Free;
Stream.Free;
END;
END;
======
- Enviar un fichero y varios parámetros a una web con POST
FUNCTION EnviarFicheroAUnaWeb: STRING;
CONST
Codificacion = 'ISO-8859-1'; // 'ISO-8859-1';
VAR
// esta en la
unit system.classes
ResponseStream: TStringStream;
// esta en la
unit IdMultipartFormData
Params: TIdMultipartFormDataStream;
fichero: STRING;
Path, Texto: STRING;
BEGIN
Result := '0';
IdHTTP1.HandleRedirects := true;
IdHTTP1.Request.BasicAuthentication := False;
// usar 'multipart/form-data' si se envian ficheros
// usar application/x-www-form-urlencoded si NO se envian ficheros
IdHTTP1.Request.ContentType := 'multipart/form-data';
IdHTTP1.Request.UserAgent := ConstanteUserAgent;
ResponseStream := TStringStream.Create('');
TRY
Params := TIdMultipartFormDataStream.Create;
TRY
Params.AddFormField('usu', 'nombre1', Codificacion);
Params.AddFormField('ruta', '123', Codificacion);
Path := DirectorioLocal;
fichero := Tpath.Combine(Path, 'index.html');
IF tfile.Exists(fichero) THEN
BEGIN
Params.AddFile('fich1', fichero);
END;
// ======================================
// añadiendo 'utf-8', 'application/octet-stream').ContentTransfer := '8bit';
// evita que el valor de los campos se trunque a 75 caracteres
// evitara muchos problemas
// Params.AddFormField('metadata', 'valor', 'utf-8', 'application/octet-stream').ContentTransfer := '8bit';
// ======================================
TRY
ResponseStream.Position:=0;
IdHTTP1.Post('https://www.miweb.com/subir.php', Params, ResponseStream);
// IdSSLOpenSSLHeaders.WhichFailedToLoad();
EXCEPT
ON E:
Exception DO
BEGIN
IF ansipos('not load SSL', E.Message) > 0 THEN
BEGIN
SHOWMESSAGE('No se puede cargar SSL');
END
ELSE
BEGIN
showmessage(Error al enviar el archivo: ' + E.Message);
END;
END;
END;
Result := ResponseStream.DataString;
FINALLY
Params.Free;
END;
FINALLY
ResponseStream.Free;
END;
END;
========
-Enviar datos por POST a una web (Los datos los recoge un programa hecho en PHP)
FUNCTION EnviarNombreUsuario(usu: STRING): STRING;
CONST
Codificacion = 'UTF8'; // 'ISO-8859-1';
VAR
// uses IdHTTP, IdMultipartFormData;
ResponseStream: TStringStream;
Params: TIdMultipartFormDataStream;
datos: STRING;
BEGIN
Result := '0';
IdHTTP1.HandleRedirects := true;
IdHTTP1.Request.BasicAuthentication := False;
// application/x-www-form-urlencoded //si no se agregan archivos
// multipart/form-data //si se agregan archivos
IdHTTP1.Request.ContentType := 'application/x-www-form-urlencoded ';
IdHTTP1.Request.UserAgent := ConstanteUserAgent;
IdHTTP1.Request.ContentEncoding := Codificacion;
// 'ISO-8859-1' ;
ResponseStream := TStringStream.Create('');
TRY
Params := TIdMultipartFormDataStream.Create;
TRY
Params.AddFormField('Usu', usu, 'utf-8', 'application/octet-stream').ContentTransfer := '8bit';
TRY
ResponseStream.Position := 0;
IdHTTP1.Post('https://www.miweb.com/subir.php', Params, ResponseStream);
EXCEPT
ON E:
Exception DO
BEGIN
//excepcion silenciosa
Abort;
END;
END;
Result := ResponseStream.DataString;
FINALLY
Params.Free;
END;
FINALLY
ResponseStream.Free;
END;
END;
=======
- Obtener nuestra
IP pública
function IP_Publica: string;
function EsNumerico( S: string ): Boolean;
begin
Result := false;
if ( Length( S ) > 0 ) then
case S[1] of
'0'..'9': Result := True;
end;
end;
var
HTMLBody: string;
i: Integer;
IdHTTP: TIdHTTP;
begin
Result := '';
// ¿Estamos conectados a Internet?
if WinInet.InternetGetConnectedState( nil, 0 ) then
begin
IdHTTP := TIdHTTP.Create( Application );
try
HTMLBody := IdHTTP.Get( 'http://checkip.dyndns.org/' );
for i := 0 to Length( HTMLBody ) - 1 do
begin
if EsNumerico( HTMLBody[i] ) or ( HTMLBody[i] = '.' ) then
Result := Result + HTMLBody[i];
end;
finally
IdHTTP.Free;
end;
end;
end;
==========
-Enviar datos a una web con POST siendo los Parámetros de tipo StringList
FUNCTION EnviarNombreUsuario(usu: STRING): STRING;
CONST
Codificacion = 'UTF8'; // 'ISO-8859-1';
VAR
// uses IdHTTP, IdMultipartFormData;
ResponseStream: TStringStream;
Params: tStringList;
BEGIN
Result := '0';
IdHTTP1.HandleRedirects := true;
IdHTTP1.Request.BasicAuthentication := False;
// application/x-www-form-urlencoded //si no se agregan archivos
// multipart/form-data //si se agregan archivos
IdHTTP1.Request.ContentType := 'application/x-www-form-urlencoded ';
IdHTTP1.Request.UserAgent := ConstanteUserAgent;
IdHTTP1.Request.ContentEncoding := Codificacion;
// 'ISO-8859-1' ;
ResponseStream := TStringStream.Create('');
TRY
Params := tStringList.Create;
TRY
Params.Add('Usu=123');
TRY
ResponseStream.Position := 0;
IdHTTP1.Post('https://www.miweb.com/subir.php', Params, ResponseStream);
EXCEPT
ON E:
Exception DO
BEGIN
//excepcion silenciosa
Abort;
END;
END;
Result := ResponseStream.DataString;
FINALLY
Params.Free;
END;
FINALLY
ResponseStream.Free;
END;
END;
Aquí tienen más ejemplos de uso:
-
Crear tu propio servidor
-
Cómo crear un proxy
-
Página de docwiki del componente
Si les ha gustado este post y quieren recibir un email cada vez que publique uno nuevo
pueden suscríbirse desde aquí
Suscribirse :
Weiterlesen...