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