Les voy a comentar, según mi experiencia personal, por qué decidí usar este componente para acceder a páginas webs, descargar archivos, utilizarlo con módulos PHP para hacer un webservice, etc... en vez de usar el componente de Indy tIdHttp.
El motivo principal radica en la transparencia con la que se maneja el acceso a las páginas seguras. Anteriormente, con el uso del componente Idhttp, era necesario implementar el idSSLIOHandlerSocketOpenSSL, realizar su configuración y añadir los archivos libcrypto.so y libssl.so (en el caso de software para Android). Todo esto implicaba un aumento en el tamaño de la aplicación y, en ocasiones, problemas que requerían tiempo para solucionar. En contraste, el uso de tNetHttpClient evita esta complejidad y permite que las aplicaciones ocupen menos espacio en la memoria, lo cual es relevante para el posicionamiento en la tienda de Google.
Últimamente estoy convirtiendo todos mis desarrollos para poder usar este componente que me simplifica la vida como programador.
Les recuerdo que si pasan parámetros por POST en la propiedad "ContentType" hay que poner:
'multipart/form-data' si se envian ficheros
'application/x-www-form-urlencoded' si NO se envian ficheros
Adjunto algunos ejemplos por si les pueden ser de utilidad.
- Descargar una página web guardándola como un string.
aURL:='www.paginaweb.com';
FUNCTION DownloadWeb(aURL: STRING): STRING;
BEGIN
TRY
Result := NetHttpClient1.Get(aURL).ContentAsString;
EXCEPT
ON E: Exception DO
BEGIN
Showmessage('Error al obtener datos');
END;
END;
END;
====
- Envíar a un modulo PHP varios parámetros por POST creando el componente NetHttpClient en tiempo de ejecución.
FUNCTION ObtenerWebPOST(progPHP: STRING): STRING;
VAR
datos: STRING;
Stream: TStringStream;
Params: tstringlist;
MiNetHttp: TNetHTTPClient;
BEGIN
Result := '';
// usar en el ContentType 'multipart/form-data' si se envian ficheros
// usar en el ContentType application/x-www-form-urlencoded si NO se envian ficheros
MiNetHttp := TNetHTTPClient.Create(NIL);
MiNetHttp.ContentType := 'application/x-www-form-urlencoded';
Stream := TStringStream.Create('');
Params := tstringlist.Create;
TRY
Params.Add('CP=08232';
Params.Add('Poblacion=Barcelona');
Stream.Position := 0;
MiNetHttp.Post('https://www.paginaweb.com/datos.php', Params, Stream);
datos := Stream.DataString;
FINALLY
Stream.Free;
Params.Free;
MiNetHttp.Free;
END;
Result := datos;
END;
=======
- Descargar desde la web un archivo utilizando un tFileStream y guardar el archivo descargado.
URL:='www.paginaweb.com/archivo.txt';
Fichero:='c:\miCarpeta\Miarchivo.txt';
PROCEDURE DownloadFile(URL, Fichero: STRING);
VAR
Stream: TFileStream;
MiNetHttp: TNetHTTPClient;
BEGIN
MiNetHttp := TNetHTTPClient.Create(NIL);
// Stream := TmemoryStream.Create; (si queremos guardar el archivo en memoria)
Stream := TFileStream.Create(Fichero, fmCreate);
TRY
MiNetHttp.Connection := 'keep-alive';
TRY
MiNetHttp.Get(URL, Stream);
EXCEPT
ON E: Exception DO
BEGIN
Showmessage('Error al descargar archivo '+e.message);
END;
END;
// Stream.SaveToFile(Tpath.Combine(Directorio, FileName)); (si se usa un tMemoryStream)
FINALLY
MiNetHttp.Free;
Stream.Free;
END;
END;
==========
- Bajar un archivo pasado como parámetro de una función indicando la ruta donde se almacenará y el nombre del fichero de destino.
URL:='https://www.paginaweb.com/archivo.txt';
Directorio:='c:\carpeta';
Archivo:='ArchivoDescargado.txt';
PROCEDURE BajarArchivoDeInternet(NetHttp: TNetHTTPClient; URL, Directorio, FileName: STRING);
VAR
Stream: TFileStream;
BEGIN
// Stream := TmemoryStream.Create; (si usamos un TmemoryStream)
Stream := TFileStream.Create(Tpath.Combine(Directorio, FileName), fmCreate);
TRY
MiNetHttp.Connection := 'keep-alive';
TRY
NetHttp.Get(URL, Stream);
EXCEPT
ON E: Exception DO
BEGIN
Showmessage('Error al descargar archivo '+e.message);
END;
END;
// Stream.SaveToFile(Tpath.Combine(Directorio, FileName)); (si usamos un tMemoryStream)
FINALLY
Stream.Free;
END;
END;
=====
- Enviar ficheros por POST con varios parámetros que se tratarán dentro de un módulo PHP.
FUNCTION EnviarFicherosALaNubeConNetHttpClient: STRING;
CONST
Codificacion = 'ISO-8859-1';
VAR
ResponseStream: TStringStream;
// esta en la uses System.Net.Mime
Params: TMultipartFormData;
Fichero: STRING;
Path, Texto: STRING;
MiNetHttp: TNetHTTPClient;
BEGIN
MiNetHttp := TNetHTTPClient.Create(NIL);
Result := '0';
MiNetHttp.ContentType := 'multipart/form-data';
MiNetHttp.acceptencoding := Codificacion; // 'ISO-8859-1'
// usar en el ContentType 'multipart/form-data' si se envian ficheros
// usar en el ContentType application/x-www-form-urlencoded si NO se envian ficheros
ResponseStream := TStringStream.Create('');
TRY
Params := TMultipartFormData.Create;
TRY
Params.AddField('calle', NombreCalle, Codificacion);
Params.AddField('poblacion', Poblacion, Codificacion);
Path := 'c:\carpeta';
Fichero := Tpath.Combine(Path, 'foto1.jpg');
IF tfile.Exists(Fichero) THEN
BEGIN
Params.AddFile('fich1', Fichero);
END;
Fichero := Tpath.Combine(Path, 'foto2.jpg');
IF tfile.Exists(Fichero) THEN
BEGIN
Params.AddFile('fich2', Fichero);
END;
Fichero := Tpath.Combine(Path, 'index.html');
IF tfile.Exists(Fichero) THEN
BEGIN
Params.AddFile('fich3', Fichero);
END;
TRY
MiNetHttp.Post('https://www.paginaweb.com/datos.php', Params, ResponseStream);
EXCEPT
ON E: Exception DO
BEGIN
showmessage('Error al enviar el archivo: ' + E.Message');
END;
END;
Result := ResponseStream.DataString;
FINALLY
Params.Free;
END;
FINALLY
ResponseStream.Free;
MiNetHttp.Free;
END;
END;
=====
- Enviar por POST varios parámetros a un módulo PHP.
FUNCTION ObtenerDatos: STRING;
VAR
datos: STRING;
Stream: TStringStream;
Params: tstringlist;
MiNetHttp: TNetHTTPClient;
BEGIN
MiNetHttp := TNetHTTPClient.Create(NIL);
Result := '';
MiNetHttp.ContentType := 'application/x-www-form-urlencoded';
Stream := TStringStream.Create('');
Params := tstringlist.Create;
TRY
Params.Add('Producto1=3509');
Params.Add('Producto2=9713');
Stream.Position := 0;
MiNetHttp.Post('https://www.mipaginaweb.php/datos.php', Params, Stream);
datos := Stream.DataString;
FINALLY
Stream.Free;
Params.Free;
MiNetHttp.Free;
END;
END;
=====
- Comprobar si un archivo existe en el servidor
(Si devuelve un código 200 es que existe)
//Añadir en el uses System.net.HTTPClient, System.Net.HTTPClientComponent
FUNCTION ArchivoExisteEnServidor(CONST URL: STRING): Boolean;
VAR
Client: TNetHTTPClient;
Response: IHTTPResponse;
BEGIN
Client := TNetHTTPClient.Create(nil);
TRY
Response := Client.Head(URL);
Result := (Response.StatusCode = 200);
FINALLY
Client.Free;
END;
END;
No hay comentarios:
Publicar un comentario