Slides Web Services em PHP com SOAP
- Set TITLE = "Web Services em PHP com SOAP"
Start presentation
Web Services em PHP com SOAP
1 - O que é SOAP [1]
- SOAP = Simple Object Acess Protocolo = Protocolo Simples de Acesso a Objetos
- É a evolução do XML-RPC
- Utiliza formato de dados em XML para comunicação
- Funciona sob o protocolo HTTP
- Permite criar aplicações distribuídas
- É um tipo de web service
- É um padrão mantido pelo W3C
- Trabalha sobre a camada http
Definições
- SOAP = é o protocolo XML de comunicação - cliente e servidor;
- WSDL = Um formato XML que permite que interfaces de serviços possam ser descritas.
- UDDI = Um protocolo para publicação de metadados sobre Web Services.
Vantagens
- Comparando com CORBA:
- É mais fácil de implementar;
- Comunicação XML é fácil de debugar;
- Comparando com XML-RPC
- Permite descrever dados mais complexos como objetos;
Desvantagens
- Comparando com CORBA:
- Comparando com XML-RPC
- É mais complexo de desenvolver
- A descrição de dados é mais complexa;
Implementações de SOAP em PHP
- SOAP - php.net [2]
- NuSOAP [3]
- É mais simples de utilizar
- Suporta SOAP 1.1, WSDL 1.1 e HTTP 1.0/1.1.
- Documentação pobre
XML Namespace [4]
- Para evitar conflitos de tags, foi criado o recurso de XML Namespace
- Veja o exemplo de conflito:
<salada>
<frutas>
<fruta>banana</fruta>
<fruta>laranja</fruta>
<fruta>morango</fruta>
</frutas>
</salada>
Baixe o código-fonte acima neste link: http://pt.wikinourau.org/pub/Main/WebServicesEmPHPComSoap/receita.xml
<supermercado>
<frutas>
<fruta>manga</fruta>
<fruta>kiwi</fruta>
<fruta>morango</fruta>
</frutas>
</supermercado>
Baixe o código-fonte acima neste link: http://pt.wikinourau.org/pub/Main/WebServicesEmPHPComSoap/supermercado.xml
Evitando conflitos com XML Namespace
<r:salada xmlns:h="http://wiki.sintectus.com/xml/salada">
<r:frutas>
<r:fruta>banana</r:fruta>
<r:fruta>laranja</r:fruta>
<r:fruta>morango</r:fruta>
</r:frutas>
</r:salada>
Baixe o código-fonte acima neste link: http://pt.wikinourau.org/pub/Main/WebServicesEmPHPComSoap/receita1.xml
<s:supermercado xmlns:s="http://wiki.sintectus.com/xml/supermercado">
<s:frutas>
<s:fruta>manga</s:fruta>
<s:fruta>kiwi</s:fruta>
<s:fruta>morango</s:fruta>
</s:frutas>
</s:supermercado>
Baixe o código-fonte acima neste link: http://pt.wikinourau.org/pub/Main/WebServicesEmPHPComSoap/supermercado1.xml
Note que a criação dos prefixos 'r' e 's' evitam os conflitos.
A forma de definir um prefixo segue a sintaxe:
xmlns:namespace-prefix="namespaceURI"
O valor de
namespaceURI não é utilizado para validar o XML, basta que seja um nome único, no entanto, geralmente aproveita-se este valor para informar um endereço contendo informações sobre o XML.
WSDL
- WSDL = Web Services Description Language
- Existe um tutorial [5] bastante interessante sobre WSDL: http://www.w3schools.com/wsdl/default.asp
- Utiliza XML Schema para definição de dados:
- XML Schema descreve a estrutura de um documento XML, assim como DTD, porém é mais poderoso;
- XML Schema é também referenciado como XSD (XML Schema Definition)
Exemplo: Servidor SOAP
<?php
function getCliente($codigo) {
$conexao = mysql_connect("localhost", "root", "");
$db = mysql_select_db("loja", $conexao);
$resultado = mysql_query("select * from cliente where codigo = $codigo")
or die("erro ao consultar:".mysql_error());
$linha = mysql_fetch_array($resultado);
mysql_close($conexao);
return array($linha[1], $linha[2]);
}
// desabilita cache
$ini = ini_set("soap.wsdl_cache_enable", "0");
// instancia servidor SOAP
$server = new SoapServer("http://localhost/~mainuzuka/soap/loja.wsdl");
$server->addFunction("getCliente");
$server->handle();
?> Baixe o código-fonte acima neste link: http://pt.wikinourau.org/pub/Main/WebServicesEmPHPComSoap/servidor.php
Criação do banco de dados
$ mysql -u root -p
$ create database loja;
$ use loja;
$ create table cliente (
codigo int unsigned auto_increment primary key,
nome varchar(40),
telefone varchar(20)
)
insert into cliente (nome, telefone) values('nome1', 'telefone1');
insert into cliente (nome, telefone) values('nome2', 'telefone2');
Exemplo: loja.wsdl
<?xml version ='1.0' encoding ='UTF-8' ?>
<definitions name='Loja'
targetNamespace='http://localhost/~mainuzuka/soap'
xmlns:tns=' http://localhost/~mainuzuka/soap'
xmlns:soap='http://schemas.xmlsoap.org/wsdl/soap/'
xmlns:xsd='http://www.w3.org/2001/XMLSchema'
xmlns:soapenc='http://schemas.xmlsoap.org/soap/encoding/'
xmlns:wsdl='http://schemas.xmlsoap.org/wsdl/'
xmlns='http://schemas.xmlsoap.org/wsdl/'>
<message name='getClienteRequest'>
<part name='codigo' type='xsd:integer'/>
</message>
<message name='getClienteResponse'>
<part name='resultado' type='xsd:enumeration'/>
</message>
<portType name='LojaPortType'>
<operation name='getCliente'>
<input message='tns:getClienteRequest'/>
<output message='tns:getClienteResponse'/>
</operation>
</portType>
<binding name='LojaBinding' type='tns:LojaPortType'>
<soap:binding style='rpc'
transport='http://schemas.xmlsoap.org/soap/http'/>
<operation name='getCliente'>
<soap:operation soapAction='urn:xmethods-cliente#getCliente'/>
<input>
<soap:body use='encoded' namespace='urn:xmethods-cliente'
encodingStyle='http://schemas.xmlsoap.org/soap/encoding/'/>
</input>
<output>
<soap:body use='encoded' namespace='urn:xmethods-cliente'
encodingStyle='http://schemas.xmlsoap.org/soap/encoding/'/>
</output>
</operation>
</binding>
<service name='LojaService'>
<port name='LojaPort' binding='LojaBinding'>
<soap:address location='http://localhost/~mainuzuka/soap/servidor.php'/>
</port>
</service>
</definitions>
Baixe o código-fonte acima neste link: http://pt.wikinourau.org/pub/Main/WebServicesEmPHPComSoap/loja.wsdl
Note neste exemplo:
- a utilização de namespaces, mas nem todas tags foram marcadas com prefixos.
Partes de um documento WSDL
- types: fornece definições de tipos de dados usados para descrever as mensagens trocadas.
- message: representa uma definição abstrata dos dados sendo transmitidos. Uma mensagem consiste de partes que são equivalentes a parâmetros de uma função.
- portType: é um conjunto de operações abstratas. Cada operação refere a uma mensagem de entrada e outra de saída.
- binding: especifica protocolos e especificações de formatos weight loss pills de dados para as operações e mensagens definidas. Define a função que será disponibilizada externamente. No nosso caso - getCliente;
- port: especifica um endereço para conexão. É um parâmetro opcional.
- service: uma coleção de pontos-finais (endpoints). Define o endereço de acesso ao webservice.
Sintaxe do WSDL conforme o W3C [6]
<wsdl:definitions name="nmtoken"? targetNamespace="uri"?>
<import namespace="uri" location="uri"/>*
<wsdl:documentation .... /> ?
<wsdl:types> ?
<wsdl:documentation .... />?
<xsd:schema .... />*
<-- extensibility element --> *
</wsdl:types>
<wsdl:message name="nmtoken"> *
<wsdl:documentation .... />?
<part name="nmtoken" element="qname"? type="qname"?/> *
</wsdl:message>
<wsdl:portType name="nmtoken">*
<wsdl:documentation .... />?
<wsdl:operation name="nmtoken">*
<wsdl:documentation .... /> ?
<wsdl:input name="nmtoken"? message="qname">?
<wsdl:documentation .... /> ?
</wsdl:input>
<wsdl:output name="nmtoken"? message="qname">?
<wsdl:documentation .... /> ?
</wsdl:output>
<wsdl:fault name="nmtoken" message="qname"> *
<wsdl:documentation .... /> ?
</wsdl:fault>
</wsdl:operation>
</wsdl:portType>
<wsdl:binding name="nmtoken" type="qname">*
<wsdl:documentation .... />?
<-- extensibility element --> *
<wsdl:operation name="nmtoken">*
<wsdl:documentation .... /> ?
<-- extensibility element --> *
<wsdl:input> ?
<wsdl:documentation .... /> ?
<-- extensibility element -->
</wsdl:input>
<wsdl:output> ?
<wsdl:documentation .... /> ?
<-- extensibility element --> *
</wsdl:output>
<wsdl:fault name="nmtoken"> *
<wsdl:documentation .... /> ?
<-- extensibility element --> *
</wsdl:fault>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="nmtoken"> *
<wsdl:documentation .... />?
<wsdl:port name="nmtoken" binding="qname"> *
<wsdl:documentation .... /> ?
<-- extensibility element -->
</wsdl:port>
<-- extensibility element -->
</wsdl:service>
<-- extensibility element --> *
</wsdl:definitions>
Exemplo: cliente.php
<?php
// desabilita cache
$ini = ini_set("soap.wsdl_cache_enable", "0");
//instancia cliente SOAP
$client = new SoapClient("http://localhost/~mainuzuka/soap/loja.wsdl");
try
{ // realiza chamada remota de método
$retorno = $client->getCliente(1);
echo $retorno[0]."<br>";
echo $retorno[1]."<br>";
}
catch (SoapFault $excecao) // ocorrencia de erro
{
echo "Erro: ";
echo $excecao->faultstring;
}
?> Baixe o código-fonte acima neste link: http://pt.wikinourau.org/pub/Main/WebServicesEmPHPComSoap/cliente.php
Referências
- http://en.wikipedia.org/wiki/SOAP
- http://www.php.net/manual/pt_BR/ref.soap.php
- http://sourceforge.net/projects/nusoap/
- http://www.w3schools.com/xml/xml_namespaces.asp
- http://www.w3schools.com/wsdl/default.asp
- http://www.w3.org/TR/wsdl#_document-s
Cadastro das Referências:
Truck Accident Lawyer custom term paper loss weight pills
radio frequency welding
candy gift baskets
70-680 exam 70-620 70-640 exam 70-642 dumps 70-643 70-680 70-640 dumps 70-620 exam70-642
70-643 exam photo retouching ulcer treatment how to hack facebook account