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:
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
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)
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
Popularity: 3%







