Professional Documents
Culture Documents
Les propongo aqu un pequeo tutorial para crear rpidamente un cliente y\o un servidor gSoap stand-alone en C/C ++. Despus de una presentacin corta, detallo all cmo hacer en Windows y en Linux.
I - Preliminares.............................................................................................................................................................3 I-A - Introduccin.................................................................................................................................................... 3 I-B - Instalacin...................................................................................................................................................... 3 I-C - A propsito de soapcpp2.exe........................................................................................................................ 3 I-D - A propsito de wsdl2h.exe............................................................................................................................ 4 II - Tutorial Windows....................................................................................................................................................4 II-A - A partir de un cabecero .h............................................................................................................................ 4 II-A-1 - El servidor.............................................................................................................................................5 II-A-2 - El cliente............................................................................................................................................... 5 II-A-3 - Las fuentes........................................................................................................................................... 6 II-B - A partir de un fichero WSDL........................................................................................................................ 6 II-B-1 - El fichero WSDL................................................................................................................................... 6 II-B-1-a - Definiciones..................................................................................................................................6 II-B-1-b - Tipos.............................................................................................................................................6 II-B-1-c - Mensajes...................................................................................................................................... 6 II-B-1-d - Port types.....................................................................................................................................7 II-B-1-e - Bindings........................................................................................................................................7 II-B-1-f - Services.........................................................................................................................................7 II-B-2 - El servidor.............................................................................................................................................7 II-B-3 - El cliente............................................................................................................................................... 8 II-B-4 - Las fuentes........................................................................................................................................... 8 II-C - Notas a propsito de las pruebas................................................................................................................ 8 III - Notas para Linux...................................................................................................................................................9 IV - Enlaces y contacto............................................................................................................................................... 9
-2Copyright 2010 - Rodrigo Pons. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://r0d.developpez.com/articles/tuto-gsoap-es/
La ventaja del 1. es que es ms sencillo: no es necesario conocer a la norma wsdl, y para un desarrollador c/c++ es ms "intuitivo" de escribir un cabecero c/c++ que un wsdl. La ventaja del 2. es que existen unos herramientas para verificar la validez del wsdl, crear un xsd correspondiente, etc. Como el wsdl es xml, es tambin ms fcil para un desarrollador que no gusta/conoce el c/c++. En ambos casos, el resultado es lo mismo: un conjunto de ficheros .h y .c/.cpp que, una vez compilados, dan un servidor y\o un cliente SOAP. El tipo de cliente/servidor (stand alone o "agregado" a un servidor existente, versin, etc.) generado depende de los parmetros de compilacin pasados a los compiladores wsdl2h y soapcpp2. En este tutorial, tratar unicamente del servidor de tipo "stand alone", y hablare de la problemtica de los proxies.
I-B - Instalacin
En primer lugar usted debe descargar gSoap. Este tutoriel es escrito y testado con la versin 2.7.14. gSoap se puede descargar en la pgina de descarga de gSoap en sourceforge y escoja la versin que usted desea. Copia le en la carpeta su eleccin, y es todo.
-C genera slo el cdigo para el cliente -S genera slo el cdigo para el servidor -L no genera los ficheros xxxLib (estos ficheros sirven para crear a nuestro cliente/camarero en forma de librera) -c genera cdigo C (si no, genera cdigo C++)
-3Copyright 2010 - Rodrigo Pons. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://r0d.developpez.com/articles/tuto-gsoap-es/
-d path especifica el lugar donde son generados los ficheros. Si este parmetro no es especificado, los ficheros son generados en la carpeta corriente..
-c genera cdigo C (si no, genera cdigo C++) -I path va a buscar el(los) fichero(s) wsdl en path -o file especifica el nombre del cabecero generado -s no genera el cdigo necesario para la utilizacin de la stl
II - Tutorial Windows
Para entender cmo funciona gSoap, vamos a crear a un servidor SOAP que resuelve una operacin simple, as como su cliente. Esta operacin simple, que llamar op1, toma 2 parmetros enteros a y b, y efecta la operacin siguiente: r = 2a + b. r es el resultado, es decir el valor que ser devuelta al cliente por el servidor.
Atencin, las funciones gSoap pueden devolver slo un entero, que es un cdigo de error. Entonces, el resultado debe ser recuperado por un parmetro pasado en forma de puntero o de referencia. Aqu, el resultado es el tercer parmetro (r). Luego, vamos a generar el cliente y el servidor. Para hacerlo, aconsejo proceder como sigue: 1. Copiar el ejecutable (soapcpp2.exe) en la misma carpeta que vuestro cabecero. 2. Crear un fichero batch (por ejemplo: mi_cs.bat), en el mismo lugar, y escribir en este fichero el comando que genera el cliente y/o el servidor. He aqu el batch ms simple que le propongo:
soapcpp2.exe -L mi_cs.h pause
El -L es para que gSoap no genera los ficheros para utilizar a nuestro cliente/servidor como una biblioteca. Esto no es necesario, pero evita la generacin de ficheros que no utilizaremos aqu. La lnea "pausa" es importante: sirve para que la ventana cmd no se cierre inmediatamente para de que podimos verificar que la generacin se ha pasado bien, o de ver, en caso de problema, los mensajes de errores. Si la generacin se ha pasado bien, los ficheros siguientes han sido creados: - soapC.cpp
-4Copyright 2010 - Rodrigo Pons. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://r0d.developpez.com/articles/tuto-gsoap-es/
- soapClient.cpp - soapServer.cpp - soapH.h - soapStub.h Estos ficheros debern ser compilados con el resto de su cdigo (salvo soapClient.cpp para el servidor, y soapServer.cpp para el cliente). Usted tambin deber aadir los ficheros stdsoap2.h y stdsoap2.cpp a su proyecto. Estos 2 ficheros se encuentran en la raz de la carpeta gSoap que usted descarg. Le aconsejo copiar estos 2 ficheros en la carpeta repertorio de su proyecto.
II-A-1 - El servidor
Un servidor gSoap es un web servicie. Entonces se trata de un bucle que espera tramas en un puerto dado. Y cuando una trama es recibida, lo lee y mira lo que puede hacer con ella. Entonces, hay 2 partes en un servidor: 1. El bucle principal 2. La definicin de las operaciones El bucle principal se parecer a esto:
SOAP_SOCKET s; // slave socket struct soap soap; /* soap structure */ for ( ; ; ) { s = soap_accept( &soap ); // Reception de una peticin std::cout << "conexin con el client valida: slave socket = " << s << std::endl; if ( !soap_valid_socket( s ) ) { std::cout << "error: problema de socket" << std::endl << "pulse una tecla para quitar"; return 1; } // ejecucin de la peticin. soap_serve() va a llamar la funcin correspondiente a la peticin. soap_serve( &soap ); // finalizatin soap_end( &soap );
Luego, las operaciones sern de simple funciones escritas en C ++. Por ejemplo, nuestra op1() ser escrita como sigue:
int op1( struct soap *soap, int a, int b, int * r ) { std::cout << "op1 llamada con: a=" << a << ", b=" << b << std::endl; *r = 2 * a + b; return SOAP_OK; }
II-A-2 - El cliente
Un cliente SOAP es un programa que enva peticiones a un servidor del que conoce la direccin y el puerto de acceso. En este tutorial, el cliente es, como el servidor, mnimo y sabe hacer slo una operacin (el que llamo op1). El cliente pues es muy simple. La unica lnea representativa de cdigo es la siguiente:
soap_call_op1( &soap, server, "", a, b, &result );
soap_call_op1 es una funcin generada por gSoap a partir de nuestro cabecero. Va a recuperar los parmetros, a crear una o varias tramas correspondientes segn el protocolo SOAP, y a enviarlas. Este cliente se utiliza as - Abrir una ventana cmd.
-5Copyright 2010 - Rodrigo Pons. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://r0d.developpez.com/articles/tuto-gsoap-es/
- Ir en el repertorio donde es generado el ejecutable del cliente. - Entre el comando siguiente: cliente a b (donde a y b son enteros).
II-B-1-b - Tipos
Luego vienen los tipos que usted necesitar. Por ejemplo, si utiliza una estructura compleja para enviar o recibir datos, hay que declararla aqu. En el ejemplo que doy aqu, no utilizo ningn tipo particular, entonces no declar nada en esta parte. Para ms precisin, le reenvo a la definicin de la norma.
II-B-1-c - Mensajes
Luego vienen las definiciones de los mensajes. Un mensaje definido por una peticin y una respuesta. En la peticin, hay que especificar los parmetros (eventualmente con tipos definidos en la seccin precedente). dem para la respuesta. Por ejemplo, para nuestra operacin op1, que toma dos enteros en entrada y que devuelve un entero, dar a esto:
<message name="op1Request"> <part name="a" type="xsd:int"/>
-6Copyright 2010 - Rodrigo Pons. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://r0d.developpez.com/articles/tuto-gsoap-es/
tutorial gSoap par Rodrigo Pons (home) <part name="b" type="xsd:int"/> </message> <message name="op1Response"> <part name="r" type="xsd:int"/> </message>
II-B-1-e - Bindings
Ahora vienen los bindings. Los bindings hacen el lazo entra los port types y las operaciones. Para op1, tendremos:
<binding name="mi_cs" type="tns:mi_csPortType"> <SOAP:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/> <operation name="op1"> <SOAP:operation style="rpc" soapAction=""/> <input> <SOAP:body use="encoded" namespace="urn:mi_cs" encodingStyle="http://schemas.xmlsoap.org/soap/ encoding/"/> </input> <output> <SOAP:body use="encoded" namespace="urn:mi_cs" encodingStyle="http://schemas.xmlsoap.org/soap/ encoding/"/> </output> </operation> </binding>
II-B-1-f - Services
Y por fin, definimos el service, en el cual especificamos, en particular, la direccin del servidor.
<service name="mi_cs"> <documentation>test of gSoap</documentation> <port name="mi_cs" binding="tns:mi_cs"> <SOAP:address location="http://127.0.0.1"/> </port> </service>
II-B-2 - El servidor
Un servidor gSoap es un web servicie. Entonces se trata de un bucle que espera tramas en un puerto dado. Y cuando una trama es recibida, lo lee y mira lo que puede hacer con ella. Entonces, hay 2 partes en un servidor: 1. El bucle principal 2. La definicin de las operaciones El bucle principal se parecer a esto:
-7Copyright 2010 - Rodrigo Pons. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://r0d.developpez.com/articles/tuto-gsoap-es/
tutorial gSoap par Rodrigo Pons (home) SOAP_SOCKET s; // slave socket struct soap soap; /* soap structure */ for ( ; ; ) { s = soap_accept( &soap ); // Reception de una peticin std::cout << "conexin con el client valida: slave socket = " << s << std::endl; if ( !soap_valid_socket( s ) ) { std::cout << "error: problema de socket" << std::endl << "pulse una tecla para quitar"; return 1; } // ejecucin de la peticin. soap_serve() va a llamar la funcin correspondiente a la peticin. soap_serve( &soap ); // finalizatin soap_end( &soap );
Luego, las operaciones sern de simple funciones escritas en C ++. Por ejemplo, nuestra op1() ser escrita como sigue:
int op1( struct soap *soap, int a, int b, int * r ) { std::cout << "op1 llamada con: a=" << a << ", b=" << b << std::endl; *r = 2 * a + b; return SOAP_OK; }
II-B-3 - El cliente
Un cliente SOAP es un programa que enva peticiones a un servidor del que conoce la direccin y el puerto de acceso. En este tutorial, el cliente es, como el servidor, mnimo y sabe hacer slo una operacin (el que llamo op1). El cliente pues es muy simple. La unica lnea representativa de cdigo es la siguiente:
soap_call_op1( &soap, server, "", a, b, result );
soap_call_op1 es una funcin generada por gSoap a partir de nuestro cabecero. Va a recuperar los parmetros, a crear una o varias tramas correspondientes segn el protocolo SOAP, y a enviarlas. Este cliente se utiliza as - Abrir una ventana cmd. - Ir en el repertorio donde es generado el ejecutable del cliente. - Entre el comando siguiente: cliente a b (donde a y b son enteros).
-8Copyright 2010 - Rodrigo Pons. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://r0d.developpez.com/articles/tuto-gsoap-es/
que nuestro servidor funcionar con otro cliente SOAP y respectivamente, que nuestro cliente funcionar con otros servidores SOAP. Par eso, suelo utilizar soapUI, que es gratuito y que usted podr encontrar aqu.
IV - Enlaces y contacto
Pgina de descargo de gSoap en sourceforge Documentacin oficial de gSoap Norma WSDL Me pueden contactar por mail aqu: pons punto rodrigue at gmail punto com.
-9Copyright 2010 - Rodrigo Pons. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://r0d.developpez.com/articles/tuto-gsoap-es/