Você está na página 1de 6

Web Service com WSDL

criado por Eder Campos Lopes em 05/01/2012 9:15am Um dos principais objetivos dos Web Services fazer a comunicao entre sistemas heterogneos de maneira distribuda. Um bom exemplo para deixar claro para os nossos amigos internaltas a comunicao entre dois servidores, um deles, dotado dos seguintes apetrechos (Windows, ISS, ASP) e outro com (Linux, Apache e PHP). Como fazer a comunicao entre estes dois servidores bom o que vamos aprender hoje. UDDI (Universal Description, Discovery and Integration): Descoberta e Publicao WSDL (Web Service Definition Language): Descrio SOAP (Simple Object Access Protocol): Mensagens Imagine o seguinte cenrio voc tem que desenvolver um WEB Service para dentro da sua empresa que fornea alguns dados dela, porm esta empresa possui uma regra especifica de como voc dever montar este Web Service. Ai entra o WSDL na jogada (falaremos mais sobre ela abaixo), ele que controla e diz o que o seu Web service ira fazer. O WSDL um arquivo que descrever um Web Service, este arquivo geralmente gerado no formato XML. Nele se encontram o nome da funo, variveis de entrada, sada, tipo dos dados, etc. Estes dados so salvos na UDDI, onde voc encontra tambm a URL para a conexo destes servios. A mquina acessa o UDDI para buscar informaes sobre um determinado servio, atravs do seu WSDL ela tem acesso ao nome da funo e as variveis de entrada e sada com seus respectivos tipos de dados. Aps feita a comunicao atravs do protocolo SOAP, utilizando-se o XML como mensagem. Existem duas maneiras mais utilizadas no PHP para se criar um Web Service, uma delas utilizando-se do mdulo SOAP Extension, uma nova extenso disponvel a partir da verso 5 do PHP, porm muito limitada e, outra a utilizao de uma API desenvolvida em PHP, denominada de NuSOAP. Sua principal vantagem o seu suporte embutido ao WSDL. Mas como estamos trabalhando com um WSDL j feito e enviado por outra empresa veremos isso na prxima pgina. 01. Utilizando o mdulo SOAP Extension do PHP Onde baixar? http://phpsoaptoolkit.sourceforge.net/phpsoap/ Configurao Entre no php.ini e adicione a seguinte linha: extension=php_soap.dll Vamos supor que esta empresa necessite que voc crie uma operao ou funo que

retorne se aquele cliente pode ser cancelado, e qual o percentual de inadiplncia que existe e uma observao. Cdigos Como exemplo, vamos criar um arquivo chamado server.php.
<?php class Params{ public $cpfdocliente; } function recuperarInformacoesCancelamento($params){ //codigo para validao do cliente no banco de dados //como acessar o parametro $cpfdocliente $Ex.: $sql = "select * from tabela where cpf_cliente = ".$params->cpfdocliente; $dados['informacoesCancelamento']['cancelamentoPermitido'] = true; $dados['informacoesCancelamento']['percentual'] 15.00; $dados['informacoesCancelamento']['observacao'] 'cancelamento permitido'; return $dados; } = =

$options = array('classmap'=>array('recuperarInformacoesCancelamento'=>'Params')) ; $server = new SoapServer("CancelamentoService.wsdl", $options); $server->addFunction('recuperarInformacoesCancelamento'); $server->handle(); ?>

Notem que para capturar o parametro enviado foi preciso criar uma classe e atribuir ao web service atravs do classmap, est foi a grande charada que eu demorei dias para encontrar. Agora vamos falar um pouco do .wsdl que encontra-se na instncia do objeto server Verificar estrutura de .wsdl no artigo
http://imasters.com.br/artigo/4422/webservices/descrevendo_um_web_serv ice_-_wsdl/ <?xml version='1.0' encoding='UTF-8'?> <wsdl:definitions name="CancelamentoService" targetNamespace="http://localhost/php/soap/ -trocar esta url para sua de produo" xmlns:ns1="http://schemas.xmlsoap.org/soap/http" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://localhost/php/soap/ -trocar esta url para sua de produo"

xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <wsdl:types> <xs:schema elementFormDefault="unqualified" targetNamespace="http://localhost/php/soap/ trocar esta url para sua de produo" version="1.0" xmlns:ns1="http://localhost/php/soap/ -trocar esta url para sua de produo" xmlns:tns="http://localhost/php/soap/ -trocar esta url para sua de produo" xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:import namespace="http://localhost/php/soap/ -trocar esta url para sua de produo" /> <xs:element name="recuperarInformacoesCancelamento" type="tns:recuperarInformacoesCancelamento" /> <xs:element name="recuperarInformacoesCancelamentoResponse" type="tns:recuperarInformacoesCancelam entoResponse" /> <xs:complexType name="recuperarInformacoesCancelamento"> <xs:sequence> <xs:element name="cpfdocliente" type="xsd:string" /> </xs:sequence> </xs:complexType> <xs:complexType name="recuperarInformacoesCancelamentoResponse"> <xs:sequence> <xs:element name="informacoesCancelamento" type="ns1:InformacoesCancelamento" /> </xs:sequence> </xs:complexType> </xs:schema> <xs:schema targetNamespace="http://localhost/php/soap/ -trocar esta url para sua de produo" version="1.0" xmlns:tns="http://localhost/php/soap/ -trocar esta url para sua de produo" xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:element name="InformacoesCancelamento" type="tns:InformacoesCancelamento" /> <xs:complexType name="InformacoesCancelamento"> <xs:sequence> <xs:element name="cancelamentoPermitido" type="xs:boolean" /> <xs:element minOccurs="0" name="percentual" type="xs:float" /> <xs:element minOccurs="0" name="observacao" type="xs:string" /> </xs:sequence> </xs:complexType> </xs:schema> </wsdl:types> <wsdl:message name="recuperarInformacoesCancelamentoResponse"> <wsdl:part element="tns:recuperarInformacoesCancelamentoResponse"

name="parameters"> </wsdl:part> </wsdl:message> <wsdl:message name="recuperarInformacoesCancelamento"> <wsdl:part element="tns:recuperarInformacoesCancelamento" name="parameters"> </wsdl:part> </wsdl:message> <wsdl:portType name="CancelamentoService"> <wsdl:operation name="recuperarInformacoesCancelamento"> <wsdl:input message="tns:recuperarInformacoesCancelamento" name="recuperarInformacoesCancelamento "> </wsdl:input> <wsdl:output message="tns:recuperarInformacoesCancelamentoResponse" name="recuperarInformacoesCancelamento Response"> </wsdl:output> </wsdl:operation> </wsdl:portType> <wsdl:binding name="CancelamentoServiceSoapBinding" type="tns:CancelamentoService"> <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/htt p" /> <wsdl:operation name="recuperarInformacoesCancelamento"> <soap:operation soapAction="" style="document" /> <wsdl:input name="recuperarInformacoesCancelamento"> <soap:body use="literal" /> </wsdl:input> <wsdl:output name="recuperarInformacoesCancelamentoResponse"> <soap:body use="literal" /> </wsdl:output> </wsdl:operation> </wsdl:binding> <wsdl:service name="CancelamentoService"> <wsdl:port binding="tns:CancelamentoServiceSoapBinding" name="CancelamentoServicePort"> <soap:address location="http://localhost/soap/server .php" /> </wsdl:port> </wsdl:service> </wsdl:definitions>

notem que neste aquivo existe


<xs:complexType name="recuperarInformacoesCancelamento"> <xs:sequence> <xs:element name="cpfdocliente" type="xsd:string" />

</xs:sequence> </xs:complexType>

Este o nome da funo que voc ir criar "recuperarInformacoesCancelamento", note que esta funo tem um parametro chamado cpfdocliente do tipo string

Esta funo tambm exige um retorno nos parametros apresentados abaixo


<xs:schema targetNamespace="http://localhost/php/soap/ -trocar esta url para sua de produo" version="1.0" xmlns:tns="http://localhost/php/soap/ -trocar esta url para sua de produo" xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:element name="InformacoesCancelamento" type="tns:InformacoesCancelamento" /> <xs:complexType name="InformacoesCancelamento"> <xs:sequence> <xs:element name="cancelamentoPermitido" type="xs:boolean" /> <xs:element minOccurs="0" name="percentual" type="xs:float" /> <xs:element minOccurs="0" name="observacao" type="xs:string" /> </xs:sequence> </xs:complexType> </xs:schema>

Vamos interpretar e traduzir para linguagem php: Este codigo esta dizendo que o response da funo recuperarInformacoesCancelamento deve ser um objeto (array, xml, class) com o nome InformacoesCancelamento com os seguintes dados cancelamentoPermitido, percentual, observacao Parte do cdigo php que descreve este retorno
$dados['informacoesCancelamento']['cancelamentoPermitido'] = true; $dados['informacoesCancelamento']['percentual'] 15.00; $dados['informacoesCancelamento']['observacao'] 'cancelamento permitido'; = =

Existe uma ferramenta muito boa que podemos testar nosso web service para ver se ele esta funcionando o nome dela soapui pode ser encontrado no site
http://www.soapui.org/

mais voc tambm pode fazer um cliente para validar seu webservice, vamos ver isso na prxima pgina.

<?php $clientSoap = new SoapClient( "http://localhsot/soap/server.php?wsdl" ); $params = array('cpfdocliente' => '00011122233344'); $result = $clientSoap->recuperarInformacoesCancelamento( $params ); print_r($result); ?>

Bom pessoal este post foi escrito com base em um post retirado do imasters e aplicado h um exemplo real que tive na minha empresa espero que ele possa lhe ajudar.

Você também pode gostar