<?xml version ='1.0' encoding ='UTF-8' ?> <message name='sumarRequest'> <portType name='ScramblePortType'> <binding name='ScrambleBinding' type='tns:ScramblePortType'> <service name='ScrambleService'> <?php function sumar($a,$b) function restar($a,$b) // turn off the wsdl cache $server = new SoapServer("scramble.wsdl"); $server->addFunction("sumar"); $server->handle(); ?> ?>
En la version 5.0 de PHP (Desconosco si en las anteriores tambien, pero no lo creo) existe una libreria llamada php_soap.dll, esta librería permite, realizar llamadas a metodos y objetos remotos utilizando el protocolo SOAP.
En este ejemplo veremos de una manera muy sencilla como invocar nuestros dos primeros metodos remotos Suma (Que dado dos numero devuelve la suma de ellos) y Resta (que dados dos numeros devuelve la resta de ellos).
Parte I
Parte II
Para lograr esto debemos cumplir con los siguientes pasos:
Activando la libreria php_soap.dll
Para hacer esto nos vamos al archivo de configuracion de php llamado php.ini, en este archivo vamos a buscar el php_soap.dll y verificamos que no este comentado, es decir, que no tenga un ";" punto y coma por delante. Algo asi:;extension=php_shmop.dll
Definir el WSDL
;extension=php_snmp.dll
extension=php_soap.dll
;extension=php_sockets.dll
extension=php_sqlite.dll
Para aprender mejor como definir tu propio WSDL te recomiendo el siguiente artículo de Desarrolloweb.com. Les recomiendo tener este archivo alojado en el servidor donde se encontrará la funcion. En nuestro caso el WSDL quedará de la siguiente manera:
Código scramble.wsdl
El archivo scramble.wsdl debe tener el targetNamespace con la ubicacion de si mismo. Tambien debemos recordar colocar la direccion del archivo del servidor (que en este tutorial se llama sumar.php), esta direcicon se coloca en la seccion Service:
<definitions name='Scramble'
targetNamespace='http://localhost/tutoriales/webservice/servidor/scramble.wdsl'
xmlns:tns='http://localhost/tutoriales/webservice/servidor/scramble.wdsl'
xmlns:soap='http://schemas.xmlsoap.org/wsdl/soap/'
xmlns='http://schemas.xmlsoap.org/wsdl/'>
<part name='symbol' type='xsd:string'/>
<part name='symbol2' type='xsd:string'/>
</message>
<message name='sumarResponse'>
<part name='Result' type='xsd:string'/>
</message>
<message name='restarRequest'>
<part name='symbol' type='xsd:string'/>
<part name='symbol2' type='xsd:string'/>
</message>
<message name='restarResponse'>
<part name='Result' type='xsd:string'/>
</message>
<operation name='sumar'>
<input message='tns:sumarRequest'/>
<output message='tns:sumarResponse'/>
</operation>
<operation name='restar'>
<input message='tns:restarRequest'/>
<output message='tns:restarResponse'/>
</operation>
</portType>
<soap:binding style='rpc'
transport='http://schemas.xmlsoap.org/soap/http'/>
<operation name='sumar'>
<soap:operation soapAction='urn:localhost-scramble#sumar'/>
<input>
<soap:body use='encoded' namespace='urn:localhost-scramble'
encodingStyle='http://schemas.xmlsoap.org/soap/encoding/'/>
</input>
<output>
<soap:body use='encoded' namespace='urn:localhost-scramble'
encodingStyle='http://schemas.xmlsoap.org/soap/encoding/'/>
</output>
</operation>
<operation name='restar'>
<soap:operation soapAction='urn:localhost-scramble#restar'/>
<input>
<soap:body use='encoded' namespace='urn:localhost-scramble'
encodingStyle='http://schemas.xmlsoap.org/soap/encoding/'/>
</input>
<output>
<soap:body use='encoded' namespace='urn:localhost-scramble'
encodingStyle='http://schemas.xmlsoap.org/soap/encoding/'/>
</output>
</operation>
</binding>
<port name='ScramblePort' binding='ScrambleBinding'>
<soap:address location='http://localhost/tutoriales/webservice/servidor/sumar.php'/>
</port>
</service>
</definitions><service name="'ScrambleService'">
<port name="'ScramblePort'" binding="'ScrambleBinding'">
<soap:address location="'http://localhost/tutoriales/webservice/servidor/sumar.php'/">
</soap:address>
</port></service>
Implementando el lado del Servidor:
En este lado vamos a crear nuestras dos funciones Sumar y Restar:
Tambien es necesario decirle al cache del SOAP cuales son las funciones de las que le hablamos en el WSDL, para eso colocaremos el siguiente codigo:function sumar($a,$b)
{
return $a+$b;
}
function restar($a,$b)
{
return $a-$b;
}// turn off the wsdl cache
ini_set("soap.wsdl_cache_enabled", "0");
$server = new SoapServer("scramble.wsdl");
$server->addFunction("sumar");
$server->addFunction("restar");
$server->handle();
Al final tendremos un archivo llamado "sumar.php" con el siguiente codigo:
Código sumar.php
{
return $a+$b;
}
{
return $a-$b;
}
ini_set("soap.wsdl_cache_enabled", "0");
$server->addFunction("restar");
Definir el lado del Cliente
Para el cliente primero creamos un formulario donde se introduciran los dos numeros que deseamos sumar, luego (si ya se recibieron los dos numeros por el metodo POST) lo que tenemos que hacer es crear un objeto SoapClient diciendole la ubicacion de nuestro WSDL, luego podremos llamar a los metodos sumar y restar como si fueran metodos de este objeto. El codigo del archivo client.php nos queda de la siguiente manera:
Código client.php
Lamentablemente no puedo demostrar este ejemplo funcionando, ya que el hosting php con el que trabajo no tiene habilitada la libreria php_soap.dll. Por ende, solo les puedo dejar un link para descargar el ejemplo.<form id="form1" name="form1" method="post" action="">
<table width="23%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td>a: </td>
<td><input name="a" type="text" id="a" size="5" /></td>
</tr>
<tr>
<td>b: </td>
<td><input name="b" type="text" id="b" size="5" /></td>
</tr>
<tr>
<td> </td>
<td><input type="submit" name="button" id="button" value="Submit" /></td>
</tr>
</table>
</form>
<?php
if(isset($_POST['a']) && isset($_POST['b']))
{
// turn off the WSDL cache
ini_set("soap.wsdl_cache_enabled", "0");
$client = new SoapClient("http://ejemplos.net78.net/webservice/servidor/scramble.wsdl");
$a = $_POST['a'];
$b = $_POST['b'];
$resultado = $client->sumar($a,$b);
print("La suma de los numeros : $a + $b es: $resultado <br>");
$resultado = $client->restar($a,$b);
print("La resta de los numeros : $a + $b es: $resultado");
}
domingo, 1 de febrero de 2009
Video tutorial WebService basico con php
Suscribirse a:
Enviar comentarios (Atom)
Uno de los ejemplos mas claros acerca de Web Services que he visto. Muchas gracias!
ResponderEliminarOpino lo mismo. Muchas gracias.
ResponderEliminarMuchisimas Gracias!!! tu ejemplo es una maravilla!....lo básico pero perfecto para comprender la esencia del asunto de los web services!!!
ResponderEliminarMuchisinas Gracias!!!! no sabes lo claro que me dejo el tema de web service. 10 puntos la verdad cortito pero al pie.-
ResponderEliminarCN
es un ejemplo sencillo pero muy claro y entendible muchisimas gracias
ResponderEliminarel video muy bueno pero no se puede descargar el ejemplo lo tienes roto, espero se pueda descargar gracias.
ResponderEliminartienes toda la razon, ya he corregido el vinculo que estaba roto. Disculpame esa!
ResponderEliminarola!! me marca un error a la ora de correrlo
ResponderEliminar"FATAL ERROR CLASS SOAP CLIENT NOT FOUND" me podrian ayudar a corregir el error. . . . gracias
Exelente lo mejor que hay en la red att GIL(GCC)
ResponderEliminarHola como estas Alejandro muy bueno tu tutorial soy de Lima - Peru y actualente deseo involucrarme mas sobre el tema de web services por un proyecto que me ha salido desearia saber si tienes mas tutoriales o como podria contactarte para tu asesoramiento mi mail es faguilar@tecprovider.com espero podamos conversar y me puedas apoyar
ResponderEliminarFernando, eres un vil estafador saca proyectos y nunca cumple
ResponderEliminarSou brasileiro e no sei espanhol.
ResponderEliminarMuito obrigado por este tutorial. Procurei a net toda e graças a Deus achei seu tutorial.
Muchisimas gracias!
Att, Alexandro (AlexSoft.4138)
Alejandro, Muy bueno el tutotial xq esta muy claro para principiantes como yo. Lo que no puedo hacer es bajar el archivo de ejemplo.
ResponderEliminarMuchas Gracias
Slds
Gonzalo
Muchas gracias el ejemplo y por ser tan claro...
ResponderEliminargracias, esto lo necesitaba :-)
ResponderEliminarestaba buscando.. pero lo explicaste bastante bien.. facil de entender...
www.studio77-k.com.mx
Alejandro eres un fenomeno, gracias por el aporte!
ResponderEliminartendras algun ejemplo un poco mas complejo, tengo trabajar con base de datos para llenar combos y guardar info.
desde ya muchas gracias!
Hola Alejandro un excelente tutorial en verdad me ayudo gracias... quisiera saber si me puedes ayudar con web services pero con dos lenguajes distintos osea Java con PHP o algo asi no se si has hecho
ResponderEliminarAmigo Este articulo es Fenomenal Saludos desde Peru, Cesar Aguirre
ResponderEliminarhey gracias por ese ejemplo lo necesitaba para entender y poner algo en el trabajo final de la maestria que es sobre webservice, me gustaria saber si puedo hacer unas modificaciones de tu codigo y ponerlo en mi trabajo, claro esta poniendo los creditos y agradecimientos en la misma, le agradeceria, necesito la contesta pa que no sea plagio.
ResponderEliminarClaro q puedes jhan carlos, enviame despues tu tesis, estos temas son interesantes!
ResponderEliminarclaro cuando la tenga lista te paso un enlace para que la veas, gracias.
ResponderEliminarBuenas Alejandro muy buen ejemplo me funciono excelente en PHP pero al momento de agregar la referencia desde visual basic 2010 da un error me gustaría saber si me podrías ayudar con este problema.
ResponderEliminaren el caso de que este utilizando linux como quedaria el wsdl?
ResponderEliminarexcelente.. me has sacado de un apuro.
ResponderEliminarMuchas gracias, eres muy claro para esplicar
ResponderEliminarLuis desde Chile
Muy Buen ejemplo, por fin le entendi como se usaba el bendito archivo wsdl
ResponderEliminargracias... un buenisimo ejemplo
ResponderEliminarExcelente ejemplo.
ResponderEliminartengo una pregunta estoy aprendiendo web service y quiero saber si php_soap y nusoap son lo mismo o son librerias distintas
Gracias.
por lo que he leido php_soap vine con php5, para la version 4 se usa nusoap, ahora pueden coexistir diferentes versiones de php, lo agregas cono add-on, primero se instala el 5 despues el 4 cuando se activa el servicion elijes con cual trabajar.
EliminarEmpece a buscar información y ejemplos sobre soap, Es increíble que tantos sitios y paginas CASI ninguna exponga un concepto de forma SENCILLA CLARA y COMPLETA. sobretodo completa. en la mayoria de sitios solo exponen partes y asumen lo demas.
ResponderEliminarDejo la palabra CASI solo por tus videos y explicaciones de este sitio que son excelentes. gracias por compartir y dedicar tiempo. es una lastima que no hayas escrito mas articulos y quedo en deuda la parte II sobre el proyecto de emprendimiento.
De nuevo muchas gracias !!
Increible tutorial me ayudo a comprender como trabaja un webservice.
ResponderEliminarEn localhost me funciono perfecto pero ya en el servidor real no a pesar de que si tiene la libreria soap activa, seguire revisando las configuraciones de este que no puede ser otra cosa y Muchas Gracias!!
Excelente Ejemplo justo lo que necesitaba para entender el funcionamiento de los webservices
ResponderEliminarMuchas Gracias
he buscado tanto un ejemplo que funcione y este me funcionó, realmente te agradezco mucho este tutorial, me quedo todo muy claro, ahora a trabajar con web service.
ResponderEliminarEste comentario ha sido eliminado por el autor.
ResponderEliminarHola amigo, tengo el siguiente problema:
ResponderEliminarHe creado el archivo "CLIENTE.PHP" como se hizo en la lección en video.En mi caso, tengo un archivo "WSDL" hecho y voy a utilizar una función llamada "ConsultPrePago".
Cuando accedo a mi "CLIENT.PHP" y paso a valores de los parámetros requeridos por la función, la página me devuelve el siguiente error:
" Catchable fatal error: Object of class stdClass could not be converted to string in C:\AppServ\www\contrato\client.php on line 38 "
En la línea 38 de mi archivo "CLIENT.PHP", tengo el siguiente código: echo $resultado;
La función se utiliza una clase llamada "TPrePago".
---------------------
Class - TPrePago
---------------------
Atributos
* CodPrePago - INT
* QtdDisponivel - INT
* Mensagem - STRING
---------------------
Mi pregunta es cómo conseguir que este tipo de cambio.
Voy a poner el enlace del archivo "CLIENT.PHP" (PDF) y WSDL (PDF). Yo no puedo poner códigos HTML en BlogSpot
Client.php - http://centercob.com.br/client.pdf
WSDL - http://centercob.com.br/WSDL.pdf
Gracias por la atención
Hola que tal, muy buen video, pero abusando de tu amabilidad como se le puede hacer para que un web service me regrese una consulta de mysql y mostrala asi como muestras el resultado de la suma y resta
ResponderEliminarAYUDA! del lado del Cliente necesito hacer lo siguiente:
ResponderEliminar$client = new SoapClient("http://localhost/ejemplo/codigo/trunk/index.php/custom/service/scramble.wdsl");
No logro hacerlo andar, no hay respuesta alguna, si lo dejo con "http://ejemplos.net78.net/webservice/servidor/scramble.wsdl" funciona perfectamente. Ya definí mi propio wsdl y todo lo necesario.
Que puede ser?