Hacer un POST o un GET a una URL con Delphi y Indy10

Tanto java como PHP tienen buenas maneras para poder hacer Post o Get a una web sin tener que programar mucho. Delphi en cambio necesita de componentes externos para poderlo realizar. PodrĂ­amos utilizar un TWebBrowser pero mi experiencia me dice que no suele funcionar muy bien para realizar este tipo de eventos. Utilizando los componentes de Indy, podemos hacer eso, realizar un Post o un Get a una URL, y poder obtener su contenido o ver que ha generado la respuesta. Con el componente TidHTTP podemos gestionar estas peticiones muy fĂ¡cilmente. En el ejemplo del GET, lo que hago es consultar una web que se que tiene una imagen, y la quiero cargar en un TImage, el problema es que la imagen estĂ¡ en formato png, por lo tanto lo que hago es cargarla en un TGraphic y la convierto a BMP para que luego la pueda tratar, el cĂ³digo es el siguiente:




procedure TForm1.Button1Click(Sender: TObject);
var
aBMP : TBitmap;
Stream: TMemoryStream;
begin
Stream := TMemoryStream.Create;
IdHTTP1.Get('http://www.stocktest.org/images.php', Stream);
Stream.Seek(0, soFromBeginning);
Stream.SaveToFile('C:\image1.png');
image2.Picture.LoadFromFile('C:\image1.png');

aBMP := TBitmap.Create;
try
aBMP.Assign(Image2.Picture.Graphic);
Image1.Picture.Assign(aBMP);
finally
aBMP.Free;
end;
end;




La parte del POST es mas sencilla, simplemente quiero enviar a la URL vĂ­a POST el usuario y el password de Ă©sta, y lo hago utilizando un TIdMultiPartFormDataStream. Como podĂ©is ver tambiĂ©n es bastante sencillo, y con estos componentes nada se nos resiste a atacar tecnologĂ­as web con nuestro Delphi de siempre. Encontrareis mĂ¡s informaciĂ³n del componente en la pĂ¡gina web oficial de Indy, ademĂ¡s hay miles de ejemplos por la red.




uses
IdMultipartFormData;

procedure TForm1.Button1Click(Sender: TObject);
var
data: TIdMultiPartFormDataStream;
begin
data := TIdMultiPartFormDataStream.Create;
try
data.AddFormField('login', 'admin');
data.AddFormField('pass', 'myPass');
Memo1.Lines.Text := IdHTTP1.Post('http://www.stocktest.org/images.php', data);
finally
data.Free;
end;
end;




Comments

  1. Excelente Post. Tambien uso Delphi (la versiĂ³n 7 especificamente) y estoy usando el componente IdHTTP para consumir de un servicio hecho en PHP. Si el servicio retorna datos usando contenttype text/html; charset=UTF-8, puedo procesarlo sin novedad, pero si el servicio retorna application/json; charset=utf-8, al tratar de obtener lo que retorna el servicio, consigo algo distinto a lo que envĂ­a el servicio (una tabla HTML :/). Alguna idea del por quĂ© de este comportamiento tan extraño ? Por cierto, le estoy asignando al componente idhttp.Request.ContentType:='application/json'.

    Gracias de antemano

    ReplyDelete

Post a Comment

Popular Posts