Chamadas ajax em outro domínio no Google appengine (crossdomain ajax)

Bom, comecei a brincar com o Google App Engine há algumas semanas para hospedar um projeto pessoal que estou desenvolvendo e fiquei muito satisfeito com o progresso pelos seguintes motivos:

1- Estou hospedando meu site de graça, em uma estrutura da Google. Apenas registrei meu domínio no registro.br, usei um serviço de DNS GRATUITO – nesse caso o Zoneedit (zoneedit.com), me cadastrei no Google Applications (google.com/a) e alterei as entradas CNAME para o Google;

2- O Google App Engine fornece uma estrutura de CDN (content delivery network), onde o seu site fica dentro de uma estrutura com balanceamento de carga e um algoritmo determina a melhor rota para servir uma página, fazendo com que o mecanismo fique muito mais rápido;

3- Além de fornecer tudo isso, permite hospedagens de páginas Python de uma maneira bem simples: basta editar um arquivo .yaml e rodar um programa python que o processo de upload está feito;

Se quiser mais detalhes disso que estou falando, tem um post interessante no 24 ways:  http://24ways.org/2008/using-google-app-engine-as-your-own-cdn

Enfim… o assunto principal aqui não é como subir o seu CDN e sim como habilitar chamadas AJAX em domínios externos. A solução, é bem simples por sinal: subir um proxy escrito em python que redirecione as requisições de GET e POST para um servidor final, lendo e imprimindo os resultados.

Como é de conhecimento de muitos, os browsers não permitem requisição HTTP fora do domínio e apresentam erros como “Security error”, óbvio.  Para resolver isso, siga a minha receita de bolo…

a) Edite o arquivo app.yaml e inclua as seguintes linhas dentro de handlers:

- url: /xpto
script: x.py

O resultado do meu arquivo app.yaml é algo do tipo:

application: meuapp
version: 1
runtime: python
api_version: 1

handlers:
- url: /
static_files: assets/*.html
upload: assets/index.html

- url: /xpto
script: x.py

- url: /
static_dir: assets

Esse parâmetro diz para redirecionar todas as requisições http que tem como destino a pasta “xpto”, para o script x.py. Depois disso precisamos criar nosso script python para fazer o proxy. Estou dando o exemplo apenas com o método GET:

# -*- coding: utf-8 -*-
import cgi
import urllib
import httplib
from google.appengine.ext import webapp
from google.appengine.api import urlfetch
from google.appengine.ext.webapp.util import run_wsgi_app
class ProxyController(webapp.RequestHandler):
 def get(self):
 
  p = self.request.str_GET
  saida=”
  page = self.response.out
  
  if p.get(‘a’,”) == ”:
   page.write(“pagina nao existe”)
  else:
   saida = p['a'] + ‘.php’
   p['a']=”
  
   params=urllib.urlencode(p)
   saida+=’?'+params
   resultado = urlfetch.fetch(url = “http://www.dxs.com.br/app/” + saida,
         method= urlfetch.GET)
         
   self.response.out.write(resultado.content)
application = webapp.WSGIApplication([('/xpto', ProxyController)],debug=True)
def main():
 run_wsgi_app(application)
 
if __name__ == “__main__”:
 main()

 



Salve na pasta raiz e depois disso, com o jQuery faça um teste…

$.get(“/xpto”,{campo1: “aaa”, campo2: “bbb”}, function(data){

alert(data);

});

Embora muita gente defenda o uso de JSONP, acredito que o modelo de proxy seja mais eficiente. A implementação do POST fica por sua conta, basta seguir a lógica :)

Dúvida, comentário, sugestão ? Utilize o formulário aqui do blog.

–Robson

Bookmarksbookmark bookmark bookmark bookmark bookmark bookmark

Popularity: 3%

No Comment

Vale Presente