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 | 1 Comentário »