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 »


Oficina de Desenho

20 July 2007 - 18:06   

A Oficina de Desenho é um software de desenho parecido com o Paint, leve e com recursos básicos de edição e manipulação de imagens, é programada em python e utiliza biblioteca gráfica PyGTK. Ela está sendo adaptada para o XO por uma equipe do NATE.

Clique na imagem abaixo para ver um Screen-shot da Oficina rodando no Sugar:

Entre as dificuldades para programar, uma das maiores foi a baixa velocidade de processamento dos objetos do tipo lista em python. Isto trazia problemas por exemplo para a função de preenchimento que era baseada no algoritmo Flood Fill e executava muito lentamente. Então decidiu-se utilizar um binding de C para esta função, já que C tem lista mais eficiente e de complexidade de ordem menor.

A estrutura básica de widgets do gtk é uma área de desenho (gtk.DrawingArea) com dois pixmaps, um temporário que não aparece na tela e é utilizado para receber modificações e outro que é o original e mostra a situação final do desenho. Os outros widgets, como toolbox, button, frame entre outros, interagem com a área de desenho enviando sinais para desenhar retas, formas pré-definidas (shapes), aplicar efeitos na imagem etc.

Na atividade, as ferramentas Undo e Redo copiam pixmaps a cada alteração que o usuário faz no desenho. Os pixmaps guardam informações da imagem que deve ser desenhada. Tendo todos os pixmaps da imagem armazenados, a ferramenta Undo ou Redo pode desfazer ou refazer qualquer parte perdida do desenho e recuperar informações de maneira muito eficaz.

A Oficina de Desenho encontra-se em estágio final de desenvolvimento e a equipe do NATE se orgulha do nível que a atividade está alcançando.

Para mais informações, visite http://wiki.laptop.org/go/Oficina_de_Desenho.

Categorias: Programação, Python | Sem Comentários »


Obtendo valores de pixels de uma imagem através de pygtk

20 June 2007 - 23:54   

PyGTK é uma bliblioteca que serve para desenvolver interfaces gráficas em python.

Tudo que você precisa saber (ou quase tudo) está em www.pygtk.org.

Como trabalhar com manipulação de imagens não é um dos objetivos do pygtk, os meios para conseguir o valor de um pixel em um determinado ponto de uma imagem são bem precários.

No programa manipulador.py o meio mais curto que encontrei para conseguir isto é mostrado!

Sempre que possível, utilize o PIL para manipulação de imagens.

Categorias: Python, Tutoriais | Sem Comentários »


Editor Musical - Demo 1.0

1 June 2007 - 13:50   

# Update
Na grade de composição, quando você pintava a nota SI, tocava a nota DO e vice-versa. Upei uma nova versão para download.

Download em:
http://code.google.com/p/editor-musical/downloads/list

Roda em qualquer SO (com ou sem Sugar). Para mais informações leia o arquivo README.

Requisitos: python, gtk, csound (com módulo csnd.py instalado).

Obs:
Falta ainda tocar a composição criada e criar alguns eventos de som do tipo ‘play’ and ’stop’.
Nesta demo, é possível tocar apenas os instrumentos da primeira linha de seleção (CLARINET, ORGAN, elecGuiter (seno), Hi-hat, SIMPLE_DRUM)

Categorias: Programação, Python | 3 Comentários »


Editor Musical

30 March 2007 - 2:07   

No próximo mês, devo trabalhar na finalização do Editor Musical para o XO.

http://wiki.laptop.org/go/Editor_Musical

O que falta:
* Reescrever pedaços do código da interface gráfica para rodar como atividade no sugar
* Começar a programar os módulos de som com o CSound
* Compartilhamento de atividade pela mesh

Categorias: Programação, Python | Sem Comentários »