Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Internet (https://www.clubdelphi.com/foros/forumdisplay.php?f=3)
-   -   TIdHTTP - Como me autentifico (https://www.clubdelphi.com/foros/showthread.php?t=73445)

URBANO 22-04-2011 12:27:52

TIdHTTP - Como me autentifico
 
Hola, necesito utilizar desde mi programa realiazo en delphi5 unos web services. Esto es algo nuevo para mi. He estado leyendo algunos hilos, recopilando información y he realizado el siguiente codigo de prueba utilizando un componente Indy.

Código:

procedure TForm1.Button1Click(Sender: TObject);
var
  http: TIdHttp;
  respuesta: string;
  datosPost: TIdMultiPartFormDataStream;
begin
  http:= TIdHTTP.Create(Self);
  http.Request.Username:= 'usuario';
  http.Request.Password:= 'clave';
  datosPost := TIdMultiPartFormDataStream.Create;
  try
  datosPost.AddFormField('description', 'ejemplo1');
  datosPost.AddFormField('comments', 'firmar documento de prueba');
  datosPost.AddFormField('reference', '1');
  datosPost.AddFormField('file', 'C:\firmar1.pdf');

  respuesta := http.Post('www.direcionwebservice', datospost);
  finally
    http.Free;
    datospost.free;
  end;

  showmessage(respuesta);

end;

Según me comenta el proveedor del web services (me ha facilitado la estructura de los datos que debo incluir en el post) antes de realizar el post hay que autentificarse según la autenticación HTTP básica estándar. Por lo que he leido he entendido que esto lo realiza directamente el componente indy y únicamente tengo que pasarle el usuario y la clave, como pongo en el codigo de ejemplo, pero algo debe estar mal, ya que al ejecutar el codigo me lanza el siguiente error: "HTTP/1.1 401 Unauthorized."
Parece ser que no me autentifico correctamente, pero el usuario y la clave son correctos, ya que si pongo la direccion del servicio en un navegador, me sale una ventana pidiendo usuario y clave, introduzco las mismas que pongo en el código y si accedo al web services.

Seguro que es un error sencillo, pero es la primera vez que utilizo las indy y que realizo conexiones web services. Alguién prodría orientame un poco.

Gracias y saludos.

URBANO 22-04-2011 13:21:57

He seguido revisando el componente indy y he visto la opción "BasicAuthentication". Dicha opción en el ejemplo anterior, por defecto es False y por lo que la he cambiado, quedando el codigo ahora:

Código:

procedure TForm1.Button1Click(Sender: TObject);
var
  http: TIdHttp;
  respuesta: string;
  datosPost: TIdMultiPartFormDataStream;
begin
  http:= TIdHTTP.Create(Self);
  http.Request.BasicAuthentication:=True;
  http.Request.Username:= 'urbano';
  http.Request.Password:= 'atm';
  datosPost := TIdMultiPartFormDataStream.Create;
  try
  datosPost.AddFormField('description', 'Atm1');
  datosPost.AddFormField('comments', 'firmar documento de prueba');
  datosPost.AddFormField('reference', '1');
  datosPost.AddFormField('file', 'C:\firmar1.pdf');

  respuesta := http.Post('http://api.portasigma.com/v1/docs/', datospost);
  finally
    http.Free;
    datospost.free;
  end;

  showmessage(respuesta);

end;

Ahora ya no me da el error de antes, tras ejecutar el codigo, ahora obtengo el error: "HTTP/1.1 401 Bad Request".
Alguna idea de este error?

Saludos.

URBANO 27-04-2011 16:40:40

:(:( Viendo que en seccion del foro no tengo muchos comentarios y según observo la mayoría de las consultas sobre Indy se han realizado en la sección de varios he trasladado este hilo a esa seccion.

Gracias a todos y si alguien quiere seguir el hilo, este se encuentra en la seccion de varios.

Saludos.

roman 27-04-2011 16:59:01

Si esto es así es precisamente porque la gente no ubica bien los temas. Este foro es más adecuado que Varios por lo que cierro el otro hilo.

// Saludos

Casimiro Notevi 27-04-2011 16:59:31

Amigo, URBANO, ¡¡¡tienes más de 120 mensajes y haces estas cosas!!!, por favor, recuerda nuestra guía de estilo, gracias.

Edito: Román, he acabado de unir ambos y me he encontrado con tu mensaje, voy a abrirlo de nuevo y a borrar los mensajes repetidos.

URBANO 27-04-2011 17:27:28

:o:o siente el lio. Ya lo habeis arreglado. Gracias.

Ya puesto, alguno de ustedes podría ayudarme. Conoceis algo de Indy.

Saludos.

roman 27-04-2011 17:37:22

Como un web service utiliza el protocolo HTTP, ciertamente puedes usar Indy para acceder al servico y mandar y recibir datos, pero es algo rudimentario. Delphi cuenta con herramientas especializadas para el manejo de los servicios web.

// Saludos

URBANO 27-04-2011 18:39:24

La verdad, nunca habia utilizado servicios web desde delphi. Como lo que tenia que hacer son post y get, leyendo por los foros, vi que muchos utilizaban TidHTTP de indy para ello, pero estoy abierto a cualquier sugerencia.
Podrías indicarme roman, que herramientas son esas que me comentas.

Saludos.

URBANO 28-04-2011 10:16:16

:(:( Nadie puede ayudarme?
Me urge, poder realizar este tipo de peticiones a una web desde delphi.

A nadie se le ha planteado el problema que comento?

roman 28-04-2011 16:54:30

Primero asegúrate de tener instalado el paquete "Borland SOAP Components". Después, en File|New|Others te vas a la pestaña "Web Services" y das doble clic sobre WSDL Importer. Te va a pedir la URL del servicio Web y sigues los pasos del asistente.

Esto te crea una unidad que declara las clases definidas en el web service y te da funciones para obtener instancias de estas clases.

En principio con esto debes poder acceder al servicio WEB.

De todas formas, el tema ha sido tratado anteriormente en los fros, así que haciendo una búsqueda puedes encontrar temas al respecto.

// Saludos

Neeruu 28-04-2011 19:16:15

TIdHTTP - Como me autentifico
 
Hola URBANO!!!

Creo que para acceder a un servicio web, me suena a que esta mas cerca lo que publico roman, que utilizando las TidHTTP...

No tengo experiencia en este tema para poder ayudarte...

Saluda Atte Neeruu!!!:)

URBANO 02-05-2011 09:38:07

Gracias Neeruu, por responder a mi correo.

Roman, gracias por tu respuesta, como me comentas he estado buscando en los foros y he estado leyendo otros post. Cuando me he dispuesto a realizar pruebas sobre lo leido, he comprobado que no tengo instalado el paquete "Borland SOAP Components". Trabajo en Delphi 5 y he revisado los cd de instalación y no trae este paquete. Con lo que me he quedado con las ganas de realizar las pruebas.:(
He estado buscando este paquete en internet pero no he dado con el. Alguien puede indicarme donde puedo conseguirlo.

Saludos.

URBANO 02-05-2011 09:52:00

Os indico más informacion sobre el portal que quiero integrar con mi aplicación desarrollada en delphi.

La API se define como una serie de servicios web “RESTful” en una arquitectura ROA (resource-oriented). Los servicios web de se basan en mecanismos estándar HTTP y respuestas en XHTML (que sepuede leer como XML bien formado). Este tipo de API se puede utilizar desde cualquier lenguaje de programación que pueda generar peticiones HTTP y decodificar XML.

Convenciones generales de implementación de la API:
• En general las peticiones que se describen requieren una previa autenticación de usuario. La autenticación se hará utilizando los mecanismos de autenticación de HTTP (p.e. autenticación básica).
• Las peticiones HTTP se comportan de forma uniforme con todos los recursos (GET: consulta, POST:
creación, PUT: modificación, DELETE: borrado).
• Los parámetros que se incluyen en peticiones POST son datos codificados como un formulario web estándar. Por defecto se utiliza la codificación application/x-www-form-urlencoded (excepto en los casos en que se deben subir archivos, en los que se usa multipart/form-data) y la codificación de caracteres UTF-8.
• Los parámetros para GET se codifican en formato URL estándar como url?
param1=valor1;param2=valor2... Éstos se utilizan como modificadores de la consulta (p.e. modo de presentación de los datos, paginación) y no para definir la ruta del recurso.

Espero que esta información sirva para orientarme mejor en como debe realizar la integración.

Saludos.

URBANO 04-05-2011 08:30:26

Sigo sin encontrar los componentes SOAP para delphi 5. :(:(

Podría alguien enviarme el paquete de instalación de este componente para delphi 5 o indicar algún sitio donde lo pueda conseguir?

Saludos.

Casimiro Notevi 04-05-2011 10:16:30

¿No lo tienes en tu equipo?, se debe llamar algo así como dclsoapxx.bpl

URBANO 05-05-2011 08:14:57

He estado buscando el fichero que me comentas en mi equipo y no he encontrado nada. Yo utilizo el delphi 5 y creo que inicialmente con esta versión no viene.

Algún enlace donde pueda descargarlo o si alguien lo tiene, me lo puede enviar.:o

Gracias.

URBANO 06-05-2011 10:17:12

Estoy intentando instalar SOAP en delphi 5, pero de momento no lo he conseguido.:mad:

URBANO 06-05-2011 19:12:46

Como aun no he podido instalar el SOAP en delphi 5 (Casimiro Notevi y yo no perdemos la esperanza :) ), he estado buscanco mas informacion sobre el componente de indy TidHTTP y he conseguido realizar "post" y "get" al Web Service que me quería conectar. Os pongo el codigo utilizado para cada uno:

Código:

procedure TForm1.Get(Sender: TObject);
begin
http.Request.Username:='user';
http.Request.Password:='pass';
showmessage(http.Get('http://apidelproveedor.com'));

//esto funciona y devuelve un fichero xml con la informacion que solicito.
end;

Código:

procedure TForm1.post-subiendofichero(Sender: TObject);
var
  datos: TIdMultiPartFormDataStream;
begin     
http.Request.Username:='user';
http.Request.Password:='pass';
datos:= TIdMultiPartFormDataStream.Create;
datos.AddFormField('description','prueba');
datos.AddFormField('comments','comentario sobre el documento');
datos.AddFormField('reference','3');
datos.AddFile('file','C:\firmar1.pdf','application/pdf');

showmessage(http.Post('http://apidelproveedor.com', datos));

datos.free;
end;

Código:

procedure TForm1.post-sinenviarfichero(Sender: TObject);
var
  aStream: TMemoryStream;
  Params: TStringStream;
begin       
http.Request.ContentType:='application/x-www-form-urlencoded';
http.Request.Username:='user';
http.Request.Password:='pass';

aStream := TMemoryStream.create;
Params := TStringStream.create('');

try
    Params.WriteString('name=' + 'pepe' + '&');
    Params.WriteString('email=' + 'pep@hotmail.com' + '&');
    Params.WriteString('id-country=' + 'ES' + '&');
    Params.WriteString('id-number=' + '44444444P');
    with HTTP do
    begin
      try
        HTTP.Post('http://apidelproveedor.com', Params,aStream);
      except
        on E: Exception do
          showmessage('Error encountered during POST: ' + E.Message);
      end;
    end;
    aStream.WriteBuffer(#0' ', 1);
    showmessage(PChar(aStream.Memory));
  except
  end;

params.free;
aStream.free;
end;

Pero ahora tengo otra duda. En la api del proveedor me indica que mediante el "post" creo un documento en mi cuenta (esto correcto como he indicado arriba) y para borrar un documento me indica que debo utilizar la operación "delete". Pero no encuentro ninguna acción "delete" en el componente TidHTTP. Tiene otro nombre? Como podría hacer esta operación?

Gracias por sus comentarios, me estan sirviendo de mucho. :)

Saludos.

URBANO 10-05-2011 08:12:44

Tras revisar mas información, he averiguado que el componente idTHHP posee la accion "DoRequest". He utilizado el siguiente código:

Código:

http.Request.Username:='User';
http.Request.password:='pass';

resultado:= TSTringStream.create('');

http.DoRequest(hmdelete,'direccion del recurso a eliminar',nil,resultado);

Pero al ejecutarlo me da el siguiente error: :(
"DOCTYPE HTML PUBLIC '-//IETF//DTD HTML 2.0//EN"

Alguien sabe que tipo de error es este?
Hay alguna otra forma de realizar un "delete" a un web service?

Saludos.

URBANO 11-05-2011 08:22:43

No encuentro nada, de como poder realizar un "delete" utilizando Indy. :(:(

Nadie puede ayudarme???

Alguna idea??????????? :confused::confused:


La franja horaria es GMT +2. Ahora son las 16:34:15.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi