Web Services com SOAP - PHP e Python

11 September 2008 - 22:52   

O objetivo deste post não é explicar o que é SOAP nem Web Services, mas sim mostrar uma maneira simples de criar um servidor que implementa um Web Service com SOAP em Python e criar um cliente em PHP que faz acesso a esse serviço.

Python é uma linguagem de programação interpretada que não possui variáveis com tipos bem definidos como em C# ou Java. Você pode por exemplo executar o seguinte código:

a = “100″ # string

a = int(a) # inteiro

Códigos assim são comuns em Python. E isso impede que a maioria das bibliotecas de SOAP gere arquivos WSDL (Web Service Description Language) porque não é possível prever tipos de parâmetros de entrada e saída de funções. Com o arquivo WSDL do servidor que implementa SOAP é muito simples de criar uma conexão e executar funções.

Se você é como eu, que tem prazer em programar em Python e desenvolve projetos simples em tempo curto, há duas opções para implementar um Web Service com SOAP em Python que permita acesso fácil através de outras linguagens de computação.

A primeira saída é escrever seu WSDL na mão. (não sou muito fã desta opção)

A segunda saída é especificar melhor as funções do seu web service como veremos no exemplo a seguir (baseado no exemplo do PythonBrasil).

Para utilizar a biblioteca SOAPpy, é necessário instalar os pacotes PyXML, Fpconst e SOAPpy. No Ubuntu:

$ sudo apt-get install python-xml python-fpconst python-soappy

Código do servidor em Python:

#!/usr/bin/python
from SOAPpy import SOAPServer

def calcula(op1,op2,operacao):
if operacao == ‘+’:
        return op1 + op2
    if operacao == ‘-’:
        return op1 - op2
    if operacao == ‘*’:
        return op1 * op2
    if operacao == ‘/’:
        return op1 / op2

server = SOAPServer((‘localhost’,8081))
server.registerFunction(calcula,“ns-calcula”,“calcula”)
# se quiser ver logs de entrada e saida descomente as linhas abaixo
# server.config.dumpSOAPOut = 1
# server.config.dumpSOAPIn = 1

server.serve_forever()

Código do cliente em Python

#!/usr/bin/python
from SOAPpy import SOAPProxy

url = “http://localhost:8081″
namespace = “ns-calcula”

server = SOAPProxy(url,namespace)
server.config.dumpSOAPOut = 1
server.config.dumpSOAPIn = 1

print server.calcula(2,3.,“*”)

Código do cliente em PHP

<?php
    $client = new SoapClient(NULL,
        array(
        “location” => “http://localhost:8081/”,
        “uri”      => “ns-calcula”,
        “style”    => SOAP_RPC,
        “use”      => SOAP_ENCODED
           ));
    $op1 = 15;
    $op2 = 3;
    $operacao = “/”;
    $a = new SoapParam($op1,“op1″);
    $b = new SoapParam($op2,“op2″);
    $c = new SoapParam($operacao,“operacao”);
    //echo $client->calcula($a,$b,$c); // modo mais bonito de chamar a função do servidor
    $retorno = $client->__soapCall(“calcula”, array($a,$b,$c));
    echo $op1.$operacao.$op2.” = “.$retorno;
?>

Obs: no PHP5, SOAP é nativo

É isso ae. Espero que esses códigos ajudem!

Abraços

Categorias: Exemplos, PHP, Programação, Python | 1 Comentário »