Delphi - integracion con portal web - post y get

 
Vista:

integracion con portal web - post y get

Publicado por Urbano (1 intervención) el 02/05/2011 10:12:52
Hola, debo realizar la integración de una aplicación desarrollada en delphi 5 con un portal web, es decir, desde mi aplicación debo enviar una serie de peticiones con información, las cuales generan una nueva solicitud en el portal web (post). Además, debo consultar el estado de esas peticiones (get).
Nunca he realizado nada de esto, es la primera vez y me gustaría que me indicarán algunos consejos o que me orientarán como debo hacerlo.

Os indico un poco de información de la API del portal web al que debo conectarme:

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.

Gracias y espero sus consejos.

Saludos.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 65
Oro
Ha mantenido su posición en Delphi (en relación al último mes)
Gráfica de Delphi

integracion con portal web - post y get

Publicado por E.T. (1244 intervenciones) el 11/05/2011 01:39:59
Mas bien lo que dice la ayuda es que el delete solo es soportado en la 1.1

1
2
3
4
5
DoRequest recognizes the HTTP methods represented in TIdHTTPMethod,
but checks to insure that ProtocolVersion indicates HTTP 1.1 for the
hmTrace, hmPut, hmOptions, and hmDelete methods.
An exception will be raised if HTTP 1.1 methods are used when the
Proctocol version indicates HTTP 1.0.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

integracion con portal web - post y get

Publicado por urbano (6 intervenciones) el 12/05/2011 19:13:45
Voy a preguntar que versión usa la api del web service que estoy utilizando. Si como pienso es la versión 2.0, tendré que buscar otra forma de hacer el delete.

Si encuentro algo ya te comento.

Gracias por tu ayuda.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

integracion con portal web - post y get

Publicado por Urbano (6 intervenciones) el 04/05/2011 08:37:49
Estoy revisando los enlaces que me has indicado. Pero el primer problema que se me ha presentado son los componentes SOAP. Yo trabajo con delphi 5 y no tengo instalado estos componentes (parece ser que vienen con delphi 6).
Donde podría conseguir el paquete de instalación de los componentes SOAP para delphi 5?

Gracias por la respuesta. Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 65
Oro
Ha mantenido su posición en Delphi (en relación al último mes)
Gráfica de Delphi

integracion con portal web - post y get

Publicado por E.T. (1244 intervenciones) el 04/05/2011 19:00:48
Estuve buscando los componentes pero no encuentro nada , deberías migrar a una version posterior de delphi pues vas a tener dificultades para encontrar algo, vi que los componentes Indy tambien trabajan con soap, pero no se si tengan versión para delphi 5

suerte
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

integracion con portal web - post y get

Publicado por urbano (6 intervenciones) el 05/05/2011 08:38:39
Pues vaya, yo pensaba que podría existir un paquete el cual se pudierá instalar en delphi 5.

Con respecto a las Indy, si se pueden instalar en delphi5. Yo entogo instalado la versión 9 de las Indy. He estado probando el componente TIdHTTP para poder realizar esto que comento, pero me encuentro con el problema de que no se como autentificarme antes de poder realizar el post. Me explico:
La dirección sobre la que hago el post es "http://api.portasigma.com/v1/docs/" . Si pones esta dirección en el navegador e intentas acceder, te sale una ventana para introducir un usuario y una clave. Si la introduces (cualquiera puede crearse una cuenta gratuita) accedes a la petición y te muestra los documentos que posees en tu cuenta. El problema radica en la ventana de autentificación, ya que desde delphi y utilizando el componente TidHTTP de indy pongo:
"respuesta:= http.post('http://api.portasigma.com/v1/docs/',datospost);"
Donde respuesta es una variable que guarda lo que devuelve el post y datospost, son los datos que envio con el post. Pero no especifico por ningún sitio el usuario y la clave de acceso, por lo que me da un error de acceso no autorizado.

Sabes como solucionar esto con Indy?

Gracias por tus comentarios.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 65
Oro
Ha mantenido su posición en Delphi (en relación al último mes)
Gráfica de Delphi

integracion con portal web - post y get

Publicado por E.T. (1244 intervenciones) el 05/05/2011 20:57:13
Me funcionó, de cierta manera, no se si sea lo que buscas, de la siguiente manera:
Modifica tu componente indy, en su propiedade "Request" despliegala y en su propiedad "BasicAuthentication" ponle true, luego haces tu operación como te habia dicho

http.Request.Username := 'User';
http.Request.Password := 'Pass';
showmessage(http.Get('http://api.portasigma.com/v1/docs/'));

lo que esta consulta me regresa es esto, al menos me está dejando entrar:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
   "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
 
<head>
    <title>Portasigma Web Services</title>
    <link rel="stylesheet" href="/v1/static/style.css" />
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
</head>
<body>
<div id="header">
    <h1>Portasigma Web Services</h1>
</div>
<div id="main">
<h2>Post a new Signature transaction</h2>
<form enctype="multipart/form-data" method="post">
    <p><label for="id_description">Description:</label> <input maxlength="120" id="id_description" type="text" name="description" /></p>
    <p><label for="id_comments">Comments:</label> <input maxlength="255" id="id_comments" type="text" name="comments" /></p>
    <p><label for="id_reference">Reference:</label> <input maxlength="255" id="id_reference" type="text" name="reference" /></p>
    <p><label for="id_file">File:</label> <input id="id_file" type="file" name="file" /></p>
    <p><input type="submit" value="OK" /></p>
</form>
 
<h2>All Signature transactions</h2>
<p>Found <span class="list-size">1</span> transactions:</p>
<ul class="documents list">
    <li class="document">
    <h3><a href="127/">Signature transaction [127]</a></h3>
        <p>id: <span class="id">127</span></p>
        <p>description: <span class="description">test</span></p>
        <p>status: <span class="status">0</span></p>
        <p>date: <span class="date">2010-06-24T05:21:20+0200</span></p>
        <p>file: <span class="filename">sun_cloudcomputing_chinese.pdf</span></p>
        <p>download: <a class="download" href="127.pdf">sun_cloudcomputing_chinese.pdf</a></p>
    </li>
</ul>
</div>
</body>
</html>
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

integracion con portal web - post y get

Publicado por urbano (6 intervenciones) el 06/05/2011 09:45:59
Perfecto , he probado lo que me comentas y me funciona. Así pues la autentificación la hace y devuelve el resultado que has mostrado, el cual hay que tratar y coger la información que me interesa.

He probado con el post (crea un nuevo documento para ser firmado), con el siguiente codigo:

Var
datos: TIdMultiPartFormDateStream;
begin
http.Request.username:='user';
http.Request.password:='pass';
datos:= TIdMultiPartFormDateStream.create;
datos.AddFormField('description','prueba22');
datos.AddFormField('comments','fichero de prueba');
datos.AddFormField('reference',22');
datos.AddFormField('file','c:\firmar1.pdf'');

showmessage(http.post('http://api.portasigma.com/v1/docs/', datos);

datos.free;
end;

Lo ejecuto y me devuelve el error "400 Bad Request" , es decir, hay un defecto en el contenido de la petición.
Según el manual de la api, eso son los cuatro parametros que hay que pasar. Creo que puede estar el error en el tipo "file" o en el formato del parametro datos. Pero no lo se con seguridad.

Si no te importa, podrías realizar una prueba para ver si obtienes el mismo error que yo.

Gracias de nuevo por tus comentarios.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

integracion con portal web - post y get

Publicado por urbano (6 intervenciones) el 06/05/2011 19:29:06
Ya he encontrado el problema.
No esta utilizando el formato correcto para el envio del documento. En el codigo anterior, hay que sustituir la linea:

datos.AddFormField('file','c:\firmar1.pdf'');

por:

datos.AddFile('file','C:\firmar1.pdf','application/pdf');

De esta forma, funciona el "post" y me crea el nuevo documento en mi cuenta.

Pero ahora tengo otra duda. Según la api, tengo que utilizar la acción "delete" para poder borrar un documento creado por mi en mi cuenta. He buscado esta acción en el componente TidHTTP de indy pero no la encuentro. Tiene otro nombre?
Como puedo hacer esta operación de borrado con este componente?

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

integracion con portal web - post y get

Publicado por urbano (6 intervenciones) el 10/05/2011 08:47:49
He estado revisando la documentación que me has comentado y otras. Y he analizado la unidad "IdHTTP" para ver como estaba estructurada las funciones "post", "get", etc....
Estas funciones realmente lo que hacen es llamar al metodo "DoRequest".

Luego he realizado pruebas con este metodo y he utilizado el siguiente codigo:
*////////////////////*
http.Request.Username:='user';
http.Requestpassword:='pass';

resultado:= TStringStream.Create('');

http.DoRequest(hmDelete,'http://api.portasigma.com/v1/docs/6297/',nil, resultado);
*////////////////////*

Pero obtengo el siguiente error:
"DOCTYPE HTML PUBLIC"-//IETF//DTD HTML 2.0//EN"

He vuelto a revisar la unidad IdHTTP y en ella indica que si la versión del protocolo es <> HTTP 1.1
el metodo hmDelete no es soportado. Puede se esto el causente del error?

Y si es así, como podría solucionarlo???

E.T. , te agradezco todos los comentarios que me estas realizando. Me esta ayudando mucho.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

integracion con portal web - post y get

Publicado por Jose (1 intervención) el 16/05/2011 16:36:16
Hola Urbano,
Curiosamente estoy desarrollando una integración al mismo portal web pero con otra tecnología, Genexus. De momento, he logrado conectarme y hacer un GET sin problemas.

Pero a la hora de hacer un POST (por ejemplo añadiendo un firmante), me devuelve un 401, osea que no estoy autorizado. Me comentan que es porque se lanza el POST desde mi aplicación, el webservice devuelve una redirección con la url del nuevo documento y por ello mi aplicación devuelve un GET a esa dirección pero sin la autorización pertinente.

Como veo que ya has utilizado el POST ¿No has tenido ningún problema? ¿Has tenido que cambiar alguna opción para ello?

Gracias!

Saludos,
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 65
Oro
Ha mantenido su posición en Delphi (en relación al último mes)
Gráfica de Delphi

integracion con portal web - post y get

Publicado por E.T. (1244 intervenciones) el 07/05/2011 01:26:17
Viendo la ayuda de delphi, hay algo que podria funcionar, solo que no se como implementarlo, tendrias que hacerlo tu a prueba y error.

procedure DoRequest(const AMethod: TIdHTTPMethod; AURL: string; const ASource: TStream; const AResponseContent: TStream); virtual;

Parameters

const AMethod: TIdHTTPMethod
The HTTP method to perform.

AURL: string
The location of the resource.

const ASource: TStream
Source of the Request data.

const AResponseContent: TStream
Destination for the Response content.

TIdHTTPMethod

Represents the HTTP Method for a request.
TIdHTTPMethod = (hmHead, hmGet, hmPost, hmOptions, hmTrace, hmPut, hmDelete, hmConnect);

Unit

IdHTTP

Description

TIdHTTPMethod is an enumerated type used to represent the HTTP method for a request. TIdHTTPMethod can be one of the following values:

hmHead - Request for Headers for the resource.
hmGet - Request to Get the content for the resource.
hmPost - Request to Post headers and data to a resource.
hmOptions - Request for communication Options supported by the server or resource.
hmTrace - Request for remote application-layer testing and diagnostic messages.
hmPut - Request to creater or replace a resource.
hmDelete - Request to Delete a server resource.

hmConnect - Request for connection to a proxy server.

Notes

hmHead, hmGet, and hmPost are supported for HTTP 1.0. Other HTTP methods require HTTP 1.1.

TIdHTTPMethod is used by TIdHTTP in the DoRequest method, and is the type used to represent the TIdHTTPRequest.Method property.

A probar con esto:
IdHTTP1.Request.Method := hmDelete;

o con el procedimiento que te habia puesto arriba

IdHTTP1.DoRequest(const AMethod: TIdHTTPMethod; AURL: string; const ASource: TStream; const AResponseContent: TStream); virtual;
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar