lunes, 5 de setiembre de 2011

ASP.NET - Consumir web service asmx desde PHP

Cómo hacemos una llamada a un servicio web asmx desde php? En este post aprenderemos a hacerlo.
invoke_web_service_asmx_from_php
Para consumir un servicio web asmx desde un cliente php hemos creado un servicio web en localhost, el cual se llama WebService1.asmx y tiene el siguiente método:
    <WebMethod()> _
    Public Function HelloWorld(YourName As String, YourAge As Integer) As String
        Return String.Format("Hello {0}, you are {1} years old.", YourName, YourAge)
    End Function 
Como ven es simple, recibe dos parámetros y devuelve una frase en un string.
Por otro lado, ahora vamos a crear una página php llamada consumer.php que contenga este pequeño retazo de código:
<?php
$YourName = 'Aniceto';
$YourAge = 50;
$WebService="http://localhost/Samples35_VB/WebService1.asmx?wsdl";
//parametros de la llamada
$parametros = array();
$parametros['YourName'] = $YourName;
$parametros['YourAge'] = $YourAge;
//Invocación al web service
$WS = new SoapClient($WebService, $parametros);
//recibimos la respuesta dentro de un objeto
$result = $WS->HelloWorld($parametros);
//Mostramos el resultado de la consulta
echo $result->HelloWorldResult;
?>
Una rápida visualización del código me muestra que tenemos dos variables, las cuales luego son parte de un array que pasará como parámetro para el web service.
Luego de eso invocamos al web service y finalmente mostramos los resultados.
Para que este ejempo funcione en tu entorno de pruebas, debes modificar tu archivo de configuración php.ini a fin de habilitar las operaciones SOAP descomentando esta línea:
extension=php_soap.dll
y luego reiniciando tu servidor APACHE a fin de que se apliquen los cambios.
Como han podido observar, es algo muy sencillo.
Espero que les sea de utilidad ;)

12 comentarios:

Appostools dijo...

Segundo buenas tardes mi nombre es donovan...tengo un problema con un web services hecho en asp.net, este corres sin ningun problema en la intranet que tiene la empresa pero al momento de hacerlo como tu ejemplo no me deja conectar......eso por una parte, luego ese mismo web services lo puse en un ip publica y de esta forma si me funciona....me podrias explicar a que se debe esto

gracias

Appostools dijo...
Este comentario ha sido eliminado por el autor.
Unknown dijo...

Buenas noches, muchas gracias, me ha servido de mucho, he realizado e invocado el webservices, no marca ningun error, pero el problema es que los parametros no los envia, los mando en blanco. espero puedas ayudar.

Gracias

Unknown dijo...

Para aquellos que como a mi no les mandaba los parametros tenemos que habilitar el cache del soap y lo hacemos con la siquiente linea de codigo
$ini = ini_set("soap.wsdl_cache_enabled","0");

Suerto

Segundo Serrano dijo...

gracias Jaime por tu aporte, no he tenido tiempo de hacer pruebas.

Saludos

Yony dijo...

Hola Segundo, muchas gracias por tu aporte estuve buscando en muchas webs elgo sencillo y no eran tan faciles de implementar y probar. Este la verdad me soluciono un problema de hace tiempo.

Gracias nuevamente, saludos
Marcel desde Uruguay

Unknown dijo...

Hola

Si los parametros son de tipo datetime en SQL server, como se debe enviar la fecha desde php.

Al enviar con date('d/m/Y'), me retorna un mensaje de error.
Los parametros que debo enviar son una fecha y hora por separado.
Necesito de su ayuda.

Gracias.

Unknown dijo...

Hola buen dia:

Tengop algunas dudas

* este cacho de codigo " _" viene por defecto o se lo tengo que agregar.

El wsdl se tiene que generar?:

* $WebService="http://localhost/Samples35_VB/WebService1.asmx?wsdl";

Segundo Serrano dijo...

Hola Ivan,

el _ es parte del nombre de la carpeta donde alojas tu proyecto, si tu proyecto tiene otro nombre, entonces no lo necesitas.

El wsdl es generado automáticamente.

Saludos

Unknown dijo...

Disculpen tengo un problema al consumir un servicio en .NET desde un cliente PHP el error es el siguiente: SOAP-ERROR: Parsing Schema: can't import schema from 'http://.....racintrato.svc?xsd=xsd0'
Por favor alguien que pueda ayudarme a encontrar el problema. Gracias.
Utilice distintos tipos de clientes SOAP : el ejemplo mencionado en este tutorial, en Nusoap y el cliente de Zend 1.0

mafe dijo...

Buenas Tardes

para utilizar este codigo tendria que descargar alguna libreria .. soy nueva en el tema.

Gracias

Anónimo dijo...

Hi Segundo,
No se si tengas experiencia alguna consumiendo un webservice de .net que retorne un dataset con un datatable dentro. No se como llegar al datatable desde PHP.

Si me ayudas con eso te estaré agradecido :)