r12 - 18 Jan 2012 - 16:24:23 - SirMapVocê está aqui: TWiki >  Web Main  > TWikiUsers > MarceloAkira > WebServicesEmPHPComSoap
, create new tag

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:
    • Tem menor desempenho
  • 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

  1. http://en.wikipedia.org/wiki/SOAP
  2. http://www.php.net/manual/pt_BR/ref.soap.php
  3. http://sourceforge.net/projects/nusoap/
  4. http://www.w3schools.com/xml/xml_namespaces.asp
  5. http://www.w3schools.com/wsdl/default.asp
  6. http://www.w3.org/TR/wsdl#_document-s


Cadastro das Referências:

Key Description
WIKIPEDIA_SOAP http://en.wikipedia.org/wiki/SOAP
SOAP_OFICIAL http://www.php.net/manual/pt_BR/ref.soap.php
NUSOAP http://sourceforge.net/projects/nusoap/
W3CSCHOOLS_WSDL http://www.w3schools.com/wsdl/default.asp
W3CSCHOOLS_NAMESPACE http://www.w3schools.com/xml/xml_namespaces.asp
WSDL_SINTAX http://www.w3.org/TR/wsdl#_document-s

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

toggleopenExibir anexostogglecloseEsconder anexos
Anexos do tópico
I Anexo Ação Tamanho Data Quem Comentário
elsephp server1.php gerenciar 0.6 K 24 Oct 2011 - 11:04 UnknownUser  
elsephp client1.php gerenciar 0.8 K 24 Oct 2011 - 11:04 UnknownUser  
elsephp cliente.php gerenciar 0.4 K 18 Jan 2012 - 16:24 UnknownUser  
xmlxml supermercado1.xml gerenciar 0.2 K 18 Jan 2012 - 16:24 UnknownUser  
elsephp servidor.php gerenciar 0.6 K 18 Jan 2012 - 16:24 UnknownUser  
xmlxml receita1.xml gerenciar 0.2 K 18 Jan 2012 - 16:24 UnknownUser  
elsewsdl loja.wsdl gerenciar 1.5 K 18 Jan 2012 - 16:24 UnknownUser  
xmlxml receita.xml gerenciar 0.1 K 18 Jan 2012 - 16:24 UnknownUser  
xmlxml supermercado.xml gerenciar 0.1 K 18 Jan 2012 - 16:24 UnknownUser  
Editar | Anexar | Impressão | Texto Puro | Referências: Web, Global | Histórico: r12 < r11 < r10 < r9 < r8 | Mais ações de tópico
 
Powered by TWiki
This site is powered by the TWiki collaboration platform Copyright © 2003 - 2012, pelos autores colaboradores. Todo o conteúdo desta página pode ser utilizado segundo os termos da Licença Creative Commons: Atribuição, Uso não Comercial e Permanência da Licença, salvo disposição em contrário indicada de forma explícita no tópico correspondente.