Web2py - Serviços

web2py fornece suporte para vários protocolos como XML, JSON, RSS, CSV, XMLRPC, JSONRPC, AMFRPC e SOAP. Cada um desses protocolos é suportado de várias maneiras, e fazemos uma distinção entre -

  • Renderizar a saída de uma função em um determinado formato.
  • Chamadas de procedimento remoto.

Renderizando um Dicionário

Considere o seguinte código que mantém a contagem das sessões.

def count():
   session.counter = (session.counter or 0) + 1
   return dict(counter = session.counter, now = request.now)

A função acima aumenta o número de contagens conforme e quando o usuário visita a página. Suponha que a função dada seja definida em“default.py”controlador da aplicação web2py. A página pode ser solicitada com o seguinte URL -http://127.0.0.1:8000/app/default/count

web2py pode renderizar a página acima em diferentes protocolos e adicionando extensão ao URL, como -

http://127.0.0.1:8000/app/default/count.html

http://127.0.0.1:8000/app/default/count.xml

http://127.0.0.1:8000/app/default/count.json

O dicionário retornado pela ação acima será renderizado em HTML, XML e JSON.

Chamadas de procedimento remoto

O framework web2py fornece um mecanismo que converte uma função em um serviço web. O mecanismo descrito aqui difere do mecanismo descrito antes porque -

  • Inclusão de argumentos na função.
  • A função deve ser definida em um modelo.
  • Ele impõe uma convenção de nomenclatura de URL mais rígida.
  • Ele funciona para um conjunto fixo de protocolos e é facilmente extensível.
  • Para usar este recurso é necessário importar e iniciar um objeto de serviço.

Para implementar este mecanismo, primeiro você deve importar e instanciar um objeto de serviço.

from gluon.tools import Service
service = Service()

Isso é implementado no "db.py" arquivo de modelo no aplicativo de andaime. Db.py model é o modelo padrão no framework web2py, que interage com o banco de dados e o controlador para obter a saída desejada para os usuários.

Após a implementação, o serviço no modelo pode ser acessado a partir dos controladores conforme e quando necessário.

O exemplo a seguir mostra várias implementações de chamadas de procedimento remoto usando serviços da web e muito mais.

Serviços web

Os Web Services podem ser definidos como uma forma padronizada de integração de aplicativos baseados na Web usando protocolos como XML, SOAP, WSDL e UDDI.

web2py suporta a maioria deles, mas a integração será bem complicada.

Consumir um serviço JSON web2py com jQuery

Há muitas maneiras de retornar o formulário JSON web2py, mas aqui consideramos o caso de um serviço JSON. Por exemplo -

def consumer():return dict()@service.json
def get_days():return ["Sun", "Mon", "Tues", "Wed", "Thurs", "Fri", "Sat"]
def call():return service()

Aqui, observamos que -

  • a função apenas retorna um dicionário vazio para renderizar a visualização, o que consumirá o serviço.

  • get_days define o serviço e a chamada de função expõe todos os serviços registrados.

  • get_days não precisa estar no controlador e pode estar em um modelo.

  • call está sempre no controlador de estrutura default.py.

Ver com as ações do consumidor são as seguintes -

{{extend 'layout.html'}}
<div id = "target"></div>

<script>
   jQuery.getJSON("{{= URL('call',args = ['json','get_days'])}}",
      function(msg){
         jQuery.each(msg, function(){ jQuery("#target").
         append(this + "<br />"); } )
      }
   );
</script>

O primeiro argumento de jQuery.getJSON é o URL do seguinte serviço - http://127.0.0.1:8000/app/default/call/json/get_days

Isso sempre segue o padrão -

http://<domain>/<app>/<controller>/call/<type>/<service>

O URL está entre {{...}}, porque é resolvido no lado do servidor, enquanto todo o resto é executado no lado do cliente. O segundo argumento dejQuery.getJSON é um retorno de chamada, que receberá a resposta JSON.

Nesse caso, o retorno de chamada percorre cada item da resposta (uma lista de dias da semana como strings) e anexa cada string, seguido por um <br/> ao <div id = "target">.

Desta forma, web2py gerencia a implementação de serviços da web usando jQuery.getJSON.