Ver Mensaje Individual
  #1 (permalink)  
Antiguo 18/11/2003, 23:49
Roitt
 
Fecha de Ingreso: noviembre-2003
Mensajes: 7
Antigüedad: 21 años
Puntos: 0
AutoRespuesta de Ayuda (SOAP y PHP)

Anteriormente postie en el foro una peticion de salva vidas por dos problemas puntuales que tenia, uno de ellos era sobre el manejo de sesiones el cual Cluster me dejo bien claro. El segundo problema era si PHP es capaz de consumir un WebService tal como lo hace VB, ASP, C++, etc (productos Micosoft).

Y la verdad es que si, era mas sencillo de lo que pensaba (PHP eres grande).

PHP puede actualizarse por medio de Pear, cierto?, bueno Pear puede descargar un paquete con librerias bien simpaticas llamadas PHP.SOAP las cuales se instalan de la siguiente manera.

Dentro del directorio de PHP existe Pear.bat, a este se le puede ejecutar desde Linea de comando (dentro de linux deberia ser algo asi como Pear.pl o .sh), se gatilla de esta forma:

Pear install SOAP

y dara un mensaje asi:

downloading SOAP-0.8RC2.tgz ...
...done: 80,053 bytes
requires package `Mail_Mime'
requires package `HTTP_Request'
requires package `Net_URL'
requires package `Net_DIME'
SOAP: Dependencies failed

Al salir esto no es gran problema solo indicamos a pear la dependencia anterior a lo que queremos instalar y el continuara....en este caso es:

Pear install Net_URL SOAP

Y asi etc...etc... hasta instalar a SOAP

downloading Mail_Mime-1.2.1.tgz ...
...done: 15,268 bytes
install ok: Mail_Mime 1.2.1
downloading SOAP-0.8RC2.tgz ...
...done: 80,053 bytes
install ok: SOAP 0.8RC2

Una vez instalado SOAP, este queda dentro del directorio de Php en \PEAR\SOAP, si entran ahi veran una serie de librerias para uso de SOAP.

Estas librerias permiten desde la generacion de un WebService en PHP (que bonito), hasta ser un simple consumidor de WebService.

PD: SOAP (Simple Object Access Protocol)es el protocolo de comunicacion entre maquinas para instancear o ejecutar objetos en forma remota, en cierta forma SOAP es parte de la evolucion de COM+ y CORBA los cuales utilizaban RPC para poder comunicarse entre maquinas e internamente (Remote Procedure Call).

Ahora yo escribi un pequeño consumidor de PHP para un webservice basico que construi en .Net, el cual posee una estructura muy basica.

Para ser llamado mi servicio web solo tiene un metodo llamado Testing. aqui esta la definicion del mensaje Soap

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:tns="http://tempuri.org/codes/" xmlns:types="http://tempuri.org/codes/encodedTypes" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body soap:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<types:Testing xsi:type="types:Testing" />
</soap:Body>
</soap:Envelope>

Este me entrega como salida (no miren las etiquetas...era de prueba) lo siguiente:

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:tns="http://tempuri.org/codes/" xmlns:types="http://tempuri.org/codes/encodedTypes" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body soap:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<types:TestingResponse xsi:type="types:TestingResponse">
<TestingResult href="#id1" />
</types:TestingResponse>
<types:a id="id1" xsi:type="types:a">
<aaaa href="#id2" />
</types:a>
<soapenc:Array id="id2" soapenc:arrayType="types:aAaaa[2]">
<Item href="#id3" />
<Item href="#id4" />
</soapenc:Array>
<types:aAaaa id="id3" xsi:type="types:aAaaa">
<aaaaaax xsi:type="xsd:string">string</aaaaaax>
<Value xsi:type="xsd:string">string</Value>
</types:aAaaa>
<types:aAaaa id="id4" xsi:type="types:aAaaa">
<aaaaaax xsi:type="xsd:string">string</aaaaaax>
<Value xsi:type="xsd:string">string</Value>
</types:aAaaa>
</soap:Body>
</soap:Envelope>


Esto se ve enrredado, si usaramos una conexion HTTP, Sockets, XMLDOM tendriamos que mandar un mensaje asi al servicio para que el responda lo de abajo que es bien basico:

<?xml version="1.0" encoding="utf-8" ?>
- <a xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://tempuri.org/codes/">
<aaaa aaaaaax="aaaa1" />
<aaaa aaaaaax="aaaa1" />
<aaaa aaaaaax="aaaa1" />
</a>


(Ustedes diran no tanto bla bla y al grano, pues algunos aun no se suben al buque y me gusta explicar lo que se XD....)

PHP por medio de esta librerias nos encapsula y libera de construir todos estos textos de protocolo Soap, y lo hace de una forma similar a como VB.Nerd lo hace al importar referencias remotas.

El codigo de prueba que hice es muy sencillo... miren


<html>
<body>
<?
//Inclusion de Libreria SoapCliente
require_once 'SOAP/Client.php';

//indicamos la url donde esta la definicion del servicio WSDL(Web Service Definition Language)
$wsdl_url = 'http://localhost/CodeSample/Codes.asmx?wsdl';

//aqui el tomara esa definicion y construira una especie de seudoclase basada en la definicion
$WSDL = new SOAP_WSDL($wsdl_url);

//Enlaza la direccion proxy a donde apunta esa clase (un path)
$client = $WSDL->getProxy();

//Aqui se llama al metodo de la clase remota del WebServ.
$books = $client->Testing();

//Ya tenemos la respuesta, y las misma librerias Serializan la
//respuesta XML que salia mas arriba y nos dio una clase con
//Donde Simplemente se recorre extrayendo los elementos
arrays
foreach($books as $index => $res)
{
//Imprimo el Attribute de lo que seria la etiqueta "aaaa"
echo "<p>".$res->aaaaaax;
}

//FIN
?>
</body>
</html>

Eso seria todo, asi de sencillo, sin parser ni nada...PHP una vez mas le patea a NicroSoft

PD: En XML un elemento o etiqueta ademas de su valor, puede contener attributos eso se definen asi <etiqueta atributo="valor"/> es una forma util y eficaz de controlar el tamaño de una respuesta y el peso de esta, asi que ocupenlas que despues de 3 años con xml, entendi que esa es la mejor forma.

Sobre como llegue a ese parecer de codigo y todo pueden ver un ejemplo muy claro de consumo en PHP de Google-Api (WebServ de Google) en una pagina chinense (primera vez que me sirven ), aqui esta la URL

http://www.pat.hi-ho.ne.jp/dimension...p_google.shtml

Sobre Pear y PHP.SOAP veanlo aqui http://www.onlamp.com/pub/a/php/2003...azon_soap.html

Espero sirva a alguien el testamento, puesto que son cosas que empezaran rapido a utilizarse, ademas son en extremo utiles.

Agradezco su paciencia para quien termino de leer, y nos estamos viendo.

Saludos a todos y suerte.

Atte
Roitt