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 »


Como fazer um <div> receber o evento “onkeypress”

17 August 2008 - 17:54   

O evento “onkeypress” ou, traduzindo, “tecla pressionada” serve para permitir que o usuário execute ações com seu teclado.

Não são todos os elementos xhtml que podem receber eventos onkeypress. O elemento mais comum que recebe esse evento é o <input type=”text”>. Como um dos elementos mais usados em xhtml é o <div> (serve para criar um bloco dentro do html) e não suporta o evento onkeypress, fiz uma gambiarra (”procedimento técnico não documentado”) que faz o <div> receber o evento.

A idéia é colocar um campo de input dentro do div que recebe o evento onkeypress e escondê-lo. Para escondê-lo, basta posicioná-lo bem longe da página. O div deve ter eventos que coloque ou tire foco do input.

Para que o esquema funcione, seu bloco de código deve ser parecido com o seguinte:

<div onclick=”divClicado()” style=”background-color:red; width:100px; height: 100px;”>
<form><input id=”div_keypress” type=”text” style=”position:absolute; left:-999999px”></form>
</div>
<script>
document.onmousedown = clickFora;
document.getElementById(”div_keypress”).onkeypress = teclaPressionada;
function divClicado() {
document.getElementById(’div_keypress’).focus();
}
function clickFora() {
document.onmousedown=document.getElementById(’div_keypress’).blur();
}
function teclaPressionada(event) {
alert(String.fromCharCode(event.which));
}
</script>

Clique aqui para ver um exemplo.

– ATUALIZADO –

O William Taniguchiin me ajudou com o problema do <div> e encontrou um “work around” para o div receber eventos no firefox.

http://n2.nabble.com/key-events-not-firing-on-div-in-FF–td663136.html

para receber eventos, no firefox deve ser setado via javascript tabIndex = -1.

Categorias: Dicas, Exemplos, Programação, Web Design | Sem Comentários »


Lista de Indexadores de Blog Completa (Ping)

7 February 2008 - 1:30   

Uma das melhores maneiras de atrair visitantes para seu Blog é divulgar seus posts em um indexador de blogs. Como há muitos indexadores de blogs na Internet, dificilmente conseguimos atingir todos. O que estes indexadores fazem é reunir vários posts em suas páginas, permitindo que usuários façam por exemplo buscas em blogs. Um exemplo de indexador de blog é o Google Blog Search.

Há sites especializados apenas em realizar ping para seu blog, mas sinceramente acho que o único que vale a pena de usar é o feedburner, pois a maioria não faz ping em mais de 20 indexadores e para cara novo post você tem que visitá-los novamente e fazer pequeno cadastro. Usando o feedburner, você pode adicionar a página a seus favoritos e abri-la quando tiver novos posts.

Para quem quiser pings automáticos, direto do wordpress, eis a minha lista completa de pings. Eu criei ela com um software que varre estes sites de ping, mas não elimina entradas duplicadas ou inválidas. Então é provável que dos mais de 190 links abaixo, cerca de 90 sejam válidos e não repetidos. Quando tiver um tempo livre, refino a lista.

Para pingar todos estes blogs com o wordpress, basta você entrar no menu de administração, Opções, Escritura, colar esta lista em Serviços de Atualização, e Atualizar Opções.

Read the rest of this entry »

Categorias: Blog, Dicas, Programação, Serviços, Tutoriais | Sem Comentários »


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 »


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 - SVN

24 May 2007 - 21:40   

Olá a todos!

Neste último mês eu e o Bruno Gola estivémos, entre outras coisas, escrevendo o Editor Musical em python.

O Bruno está cuidando da parte de áudio (CSound) e eu tenho escrito alguns módulos de Interface Gráfica.

Por enquanto, o som não roda em linux sem sugar porque o sugar tem alguns binds de CSound especiais. Se quiser ouvir alguma coisa, o recomendável é fazer testes no sugar.

O projeto (com o código) está em um repositório do google:
http://code.google.com/p/editor-musical/

Para baixar o código no seu computador, você precisa de algum cliente svn. Para linux, você pode instalar o subversion.
Em sistemas debian:
# sudo apt-get install subversion
ou
# sudo apt-get install svn

Com o cliente instalado, basta executar o comando:
# svn checkout http://editor-musical.googlecode.com/svn/trunk/ editor-musical

Assim, você baixará a versão em linux sem sugar e a versão para o sugar.

Para usar a versão em linux:
# cd editor-musical/linux/Musical\ Editor/
# python MusicalEditor.py

Para usar a versão em sugar, copie a pasta ‘ editor-musical/sugar/MusicalEditor.activity/ ‘ para a pasta do seu sistema emulado do XO ou do seu laptop XO: ‘ /usr/share/activities ‘
Reinicie o sugar (ctrl-alt-backspace) e um ícone será adicionado ao frame.

Ainda falta bastante coisa para fazer, mas já dá para ter uma boa idéia do que está acontecendo.
Semana que vem, se tudo der certo, o Editor Musical estará pronto.

Amanhã haverá reunião no NATE para discutirmos um possível módulo de comunicação para atividades compartilhadas.

Então é possível que logo o Editor Musical funcione em modo compartilhado (modo para o qual foi projetado).

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