2006/03/26
No Comments
Reading time: 3 – 5 minutes
Al programar un webservice amb el PHP5 és més que trivial tal com podem llegir a la documentació sobre SOAP (local) del propi PHP. El problema ve quan volent aprofitar la simplicitat dels serveis SOAP toca programar a mà el WSDL. O sigui, agafa i posat a definir la interficie en XML de la/es classe/s que vols exportar a través del webservice, o sigui, una missión imposible.
La meva sorpresa ha estat veure que després d’adpotar el Zend Studio com a IDE de programació del meu codi PHP he vist que disposava d’un assistent ben senzill d’usar per tal de generar automàticament aquest fitxer WSDL. La cosa és ben senzilla imaginem que usem el codi de l’exemple de la web de Zend, com comentava abans.
El servidor SOAP:
<?php
class QuoteService {
private $quotes = array("ibm" => 98.42);
function getQuote($symbol) {
if (isset($this->quotes[$symbol])) {
return $this->quotes[$symbol];
} else {
throw new SoapFault("Server","Unknown Symbol '$symbol'.");
}
}
}
$server = new SoapServer("server2.wsdl");
$server->setClass("QuoteService");
$server->handle();
?>
El client, encara més simple que el servidor:
<?php
$client = new SoapClient("server2.wsdl");
print($client->getQuote("ibm"));
?>
Ara que ja tenim el codi en el nostre Zend, només cal que anem a:
Cal seguir l’assistent que no és massa difícil, aquí en teniu els passos capturats per l’exemple del que parlem:
Podeu veure com s’exporten automàticament les classes dels arxius que seleccioneu, cal que poseu al costat de cada classe exportada la URL a través de la qual s’accedeix al servei:
Al final obtenim el fitxer WSDL, en el nostre cas aquest:
<?xml version='1.0' encoding='UTF-8'?>
<!-- WSDL file generated by Zend Studio. -->
<definitions name="server2" targetNamespace="urn:server2" xmlns:typens="urn:server2" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns="http://schemas.xmlsoap.org/wsdl/">
<message name="getQuote">
<part name="symbol"/>
</message>
<message name="getQuoteResponse">
<part name="getQuoteReturn"/>
</message>
<portType name="QuoteServicePortType">
<operation name="getQuote">
<input message="typens:getQuote"/>
<output message="typens:getQuoteResponse"/>
</operation>
</portType>
<binding name="QuoteServiceBinding" type="typens:QuoteServicePortType">
<soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
<operation name="getQuote">
<soap:operation soapAction="urn:QuoteServiceAction"/>
<input>
<soap:body namespace="urn:server2" use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
</input>
<output>
<soap:body namespace="urn:server2" use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
</output>
</operation>
</binding>
<service name="server2Service">
<port name="QuoteServicePort" binding="typens:QuoteServiceBinding">
<soap:address location="http://oriol.joor.net/soap/server2.php"/>
</port>
</service>
</definitions>
Si sou observadors notareu que aquest fitxer és lleugerament diferent al de la documentació que mostra Zend. Però jo l’he provat i funciona perfectament així doncs no m’hi trencaré el cap en saber a què es deuen aquests petits canvis al implmentar aquest format XML.