El ya conocido protocolo SOAP llega de forma nativa a PHP en la versión 5.
Para el que no sepa qué es esto de SOAP, es a grandes rasgos, un protocolo que permite llamar a funciones que están en otra máquina, de forma que podamos pasarle los parámetros y nos pueda devolver la respuesta de forma transparente, la comunicación es en formato XML y se suele hacer sobre el protocolo HTTP. S quereis más información, podeis buscar términos como SOAP, UDDI, WDSL,...
La cuestión es que PHP5 lo soporta de forma nativa, con lo que consigue máxima transparecia al programador. Por ejemplo si tenemos funciones ya implementadas en php y queremos publicarlas como servicio web, sólo tenemos que crear una página php con las siguientes líneas:
$servidor = new SoapServer(null,array("uri"=>""));
$servidor->addFunction("mifuncion");
//podemos añadir cuantas funciones queramos
$servidor->handle();
Es así de sencillo y de simple para el programador. Hay que tener en cuenta que esto que he puesto sería la forma más rápida y sencilla de conseguirlo, pero en el constructor se le pueden configurar muchas cosas.
Crear un cliente SOAP es igual de sencillo:
$cliente = new SoapClient(null,array("location"=>"","uri"=>""));
$cliente->mifuncion();
Así de simple, una vez creado el cliente, simplemente lo tratamos como si fuese un objeto con todos los método que implementa el servidor, ya PHP5 se encarga de implementar el protocolo y de que todo sea lo más transparente posible para el usuario.
Fácil y simple, ¿verdad?
José Carlos Calvo
Para el que no sepa qué es esto de SOAP, es a grandes rasgos, un protocolo que permite llamar a funciones que están en otra máquina, de forma que podamos pasarle los parámetros y nos pueda devolver la respuesta de forma transparente, la comunicación es en formato XML y se suele hacer sobre el protocolo HTTP. S quereis más información, podeis buscar términos como SOAP, UDDI, WDSL,...
La cuestión es que PHP5 lo soporta de forma nativa, con lo que consigue máxima transparecia al programador. Por ejemplo si tenemos funciones ya implementadas en php y queremos publicarlas como servicio web, sólo tenemos que crear una página php con las siguientes líneas:
$servidor = new SoapServer(null,array("uri"=>""));
$servidor->addFunction("mifuncion");
//podemos añadir cuantas funciones queramos
$servidor->handle();
Es así de sencillo y de simple para el programador. Hay que tener en cuenta que esto que he puesto sería la forma más rápida y sencilla de conseguirlo, pero en el constructor se le pueden configurar muchas cosas.
Crear un cliente SOAP es igual de sencillo:
$cliente = new SoapClient(null,array("location"=>"
$cliente->mifuncion();
Así de simple, una vez creado el cliente, simplemente lo tratamos como si fuese un objeto con todos los método que implementa el servidor, ya PHP5 se encarga de implementar el protocolo y de que todo sea lo más transparente posible para el usuario.
Fácil y simple, ¿verdad?
José Carlos Calvo
¿De qué me sonará a mí esto?
ResponderEliminarFijate que tenes un error.
ResponderEliminarNo es ServerSoap sino SoapServer
$servidor = new SoapServer(null,array("uri"=>""));
$servidor->addFunction("getQuote");
//podemos añadir cuantas funciones queramos
$servidor->handle();
Saludos
Gracias Pablo, efectivamente es al revés :)
ResponderEliminarTampoco el cliente es correcto.
ResponderEliminarEs SoapClient no ClientSoap
Me gustaría ver un ejemplo funcionando de SOAP en php5...
ResponderEliminarTengo php 5.0.4 y no soy capaz de hacerlo funcionar... :S alguien me echa un cable?
¿Qué errores te da? Lo que he puesto en la entrada es un ejemplo real que funciona.
ResponderEliminarCuentanos qué tienes, y vemos como ayudarte :)
Un saludo
Hola tengo el suguiente error Uncaught SoapFault exception: [SOAP-ENV:Client] No Deserializer found to deserialize a 'http://mucRegistra/RegistraManifiesto.xsd:ArrayOfmucRegistra_RemesaType2User' using encoding style 'http://schemas.xmlsoap.org/soap/encoding/'. [java.lang.IllegalArgumentException] in E:\web\soinpro\carga\g_webservices_cp2.php:149 Stack trace: #0 [internal function]: SoapClient->__call('wsmani', Array) #1 E:\web\soinpro\carga\g_webservices_cp2.php(149): SoapClient->wsmani(96191554, 8600068755, 'MIAGCSqGSIb3DQE...', '96191554;860006...', Object(pregRemesa), Object(pregManifiesto), Object(pregVehiculo), Object(pregConductor), Object(pregTercero)) #2 {main} thrown in E:\web\soinpro\carga\g_webservices_cp2.php on line 149 usando php 5 no se si alguno me puede hechar una manita
ResponderEliminarHola, estoy nuevo en el tema de conexión a WebService..
ResponderEliminarAlguien me puede colaborar con algun ejemplo o link material para leer y poderme conectar a un WebServices de la empresa ?
Mil gracias
Buenos días ¿Te refieres a WebServices con PHP y SOAP?
ResponderEliminarDe camino voy a modificar la entrada con los comentarios de cambios que se hicieron hace tiempo :)
ResponderEliminarGracias Pablo e ikarush
Hola.
ResponderEliminarEstoy probando un cliente soap (hecho por mi) que comunique con un servidor soap (que no lo he hecho yo). Por fin lo logré conectar y enviarle una peticion mediante __doRequest, pero la respuesta que me devuelve, no hay forma de interpretarla, lo he intentado con simple_xml_loadstring y nada, es como si fuese todo una cadena de texto, pero al mirar el codigo fuente que genera mi web, se ve el codigo xml.
Alguna idea?? muchas gracias de antemano
Buenas tardes,
ResponderEliminar¿Podrías darnos un enlace para ver lo que genera tu web? La cuestión es ver si es un XML válido.
De todas formas, si en lugar de __doRequest llamas directamente a la función, la API SOAP te deserializará la información.
Quedamos a tu disposición para seguir tirando del hilo :)
Este comentario ha sido eliminado por un administrador del blog.
ResponderEliminarSe me ha olvidado comentar un detalle, las pruebas las estoy haciendo con SOAPui y el codigo que me devuelve SOAPui y PHP (con __doRequest) son iguales, pero no puedo acceder a la info individual ...
ResponderEliminarY otra cosa que se me ha olvidado "que cabecica!!" utilizo __doRequest, por que es el unico medio por el que he visto que se puede pasar el archivo XML a pelo (la peticion de SOAPui entera xD)
ResponderEliminarHolaaaa, de nada, lo que esté en nuestra mano :)
ResponderEliminarHe estado mirando la pagina de ejemplo y veo que ya estás sacando cosas del XML, ¿has conseguido que ya funcione? Si no es así, me vendría bien tener el código para probarlo en mi máquina y ver qué puede pasarle
Estamos en contacto
Medianamente he solucionado la cosa, de forma muy muy chapucera para mi gusto. La cadena, la he cortado por y despues por para obtener lo que hay entre ambas etiquetas, si me das una direccion de email, te puedo enviar el codigo
ResponderEliminarMe he dado cuenta que oculta las etiquetas HTML esto automaticamente.
ResponderEliminarPara tener tu email, mandame uno a ccorrales.z13@gmail.com y asi ficho tu email xD
Lo dicho, muchas gracias por todo
Ya tienes mi correo
ResponderEliminarYa tienes mi correo
ResponderEliminarBuenas.
ResponderEliminarEstoy creando un webservice. (quiero tener 2 tiendas online en servidores diferentes, uno actua como maestro "es el que tiene la BD" y el otro servidor actua como cliente "tiene que acceder a la BD del maestro, pero no se deben ver los datos de la cadena de conexion de la BD").
He probado haciendolo con el ejemplo que se muestra en este blog, funciona perfect, pero lo veo demasiado lento.
Por lo que he leido por ahi, el inconveniente soap es que consume mucho ancho de banda para peticiones sencillas.
Hay alguna alternativa a soap para hacer lo que pretendo de forma rapida ??
Muchas gracias de antemano.
Quizá en ese caso lo mejor sería usar una base de datos en modo réplica, siendo la BD maestro donde se hacen las modificaciones. Esa forma sería la más rápida porque todo se sincroniza muy a bajo nivel y de forma asíncrona, teniendo los datos siempre en local
ResponderEliminarBuenas !
ResponderEliminarBuscando info por google sobre SOAP me he tropezado con esto y quizas puedan ayudarme. Estoy intentando hacer una peticion SOAP de la misma forma que explican al principio de este post.
Pero me da un fallo de soap que no se porque ... el fallo es el siguiente:
Fatal error: Uncaught SoapFault exception: [VersionMismatch] Wrong Version in ...
Alguien sabe a cuento de que viene ese error?? estoy utilizando soapui para pruebas y me va perfect con los mismos datos ...
Gracias