O XML-RPC, ou Chamada de Procedimento Remoto via XML, é um protocolo que permite a comunicação entre sistemas distribuídos utilizando HTTP como transporte e XML para codificação de mensagens. Essa abordagem simplifica a interoperabilidade entre diferentes plataformas, pois define uma estrutura padronizada para invocar métodos remotamente, facilitando a troca de dados complexos.
Vantagens do XML-RPC
- Suporte à transmissão de estruturas de dados elaboradas, como listas e dicionários.
- Capacidade de encapsular chamadas remotas em objetos locais através de bibliotecas específicas de linguagens de programação.
Implementação em Python
No ecossistema Python, o módulo SimpleXMLRPCServer é empregado para configurar servidores XML-RPC, enquanto xmlrpclib (ou xmlrpc.client em versões mais recentes) serve como cliente para consumir serviços expostos. É importante notar que o cliente não é intrinsecamente seguro contra dados maliciosos, cabendo ao desenvolvedor implementar validações adicionais.
O fluxo típico envolve registrar funções ou instâncias no servidor e, no cliente, utilizar um proxy para chamar esses métodos remotamente.
Exemplo Prático
Servidor: Este código configura um servidor simples que retorna uma saudação.
import SimpleXMLRPCServer
class GerenciadorServico:
def obter_saudacao(self):
return "Olá, mundo via XML-RPC"
servico = GerenciadorServico()
servidor = SimpleXMLRPCServer.SimpleXMLRPCServer(("127.0.0.1", 9090))
servidor.register_instance(servico)
print("Servidor ativo na porta 9090")
servidor.serve_forever()
Cliente: Este trecho conecta-se ao servidor e invoca o método registrado.
import xmlrpclib
proxy = xmlrpclib.ServerProxy("http://127.0.0.1:9090")
resposta = proxy.obter_saudacao()
print("Resposta recebida:", resposta)
Para executar, inicie o servidor em um terminal e, em seguida, o cliente em outro. A saída esperada no cliente será a mensagem de saudação.
O servidor padrão é monolítico, o que significa que processa requisições sequencialmente. Para suportar múltiplas conexões simultaneamente, pode-se adaptá-lo utilizando ThreadingMixIn.
from SimpleXMLRPCServer import SimpleXMLRPCServer
from SocketServer import ThreadingMixIn
class ServidorConcorrente(ThreadingMixIn, SimpleXMLRPCServer):
pass
class GerenciadorServico:
def obter_saudacao(self):
return "Olá, mundo via XML-RPC"
servico = GerenciadorServico()
servidor_concorrente = ServidorConcorrente(("127.0.0.1", 9090), allow_none=True)
servidor_concorrente.register_instance(servico)
print("Servidor concorrente ativo na porta 9090")
servidor_concorrente.serve_forever()