Suggerimento rapido utilizzo di Google App Engine come server proxy

Google App Engine può essere utilizzato come un modo comodo e gratuito per aggirare o escludere i file di criteri dei domini incrociati. Questo tutorial ti mostrerà come creare un proxy GAE che fornisce accesso a risorse riservate per la tua applicazione Flash.


Anteprima del risultato finale

Diamo un'occhiata al risultato finale su cui lavoreremo:

Questo ha appena inviato alcuni dati di test a un foglio di calcolo remoto ospitato su Google Docs. Ciò non funzionerebbe senza un file crossdomain.xml nel dominio ricevente, tuttavia, il file di criteri interdominio su Google Documenti non lo consente e non posso cambiarlo. Continua a leggere per scoprire come è stato fatto.


Perché usare un proxy?

Nel mio ultimo suggerimento rapido Una guida ai file di criteri di dominio incrociato vi ho mostrato come i file di criteri interdominio sono utilizzati da Flash per determinare quali dati sono accessibili dai domini remoti. Mentre è in grado di controllare l'accesso alle risorse è ottimo per gli amministratori, è un problema per gli sviluppatori di Flash cercare di accedere ai dati su un server che non ha un file di criteri tra domini, poiché nessun file di criteri non significa accesso. La configurazione di un file di criteri interdominio può essere facilmente trascurata e ho incontrato più di un fornitore di servizi Web che non pensava di soddisfare gli sviluppatori Flash.

Ho anche detto che il problema è stato facilmente aggirato con l'uso di un proxy. L'idea alla base di un proxy è che accetterà connessioni da applicazioni Flash remote (fornendo il file crossdomain.xml appropriato), quindi fungerà da intermediario che passa i dati avanti e indietro. L'unico requisito reale di un server proxy (in relazione a Flash) è che dovrebbe essere in grado di accedere alle risorse pubbliche indipendentemente dalle autorizzazioni che possono o meno essere concesse da una politica di dominio incrociato.

La buona notizia è che puoi configurare solo un proxy senza costi iniziali utilizzando Google App Engine (GAE). GAE ospiterà un'applicazione web e, supponendo che i requisiti di traffico siano inferiori alla soglia, non ci sono costi. Quello che dimostrerò qui è come creare una semplice applicazione web GAE che possa fungere da proxy, consentendo alle applicazioni Flash di accedere a risorse che altrimenti sarebbero off limits.


Passaggio 1: fogli di lavoro di Google e il temuto crossdomain.xml

In Google Documenti c'è una funzione davvero carina che ti consente di creare un modulo web che può essere utilizzato per compilare un foglio di calcolo. Ho creato solo una tale forma qui, con i risultati di questo modulo che viene pubblicato come pagina web pubblica qui. Il modulo è un modulo HTML standard, che può essere inviato a livello di codice utilizzando un'operazione POST HTTP standard.

Recentemente sono stato nella posizione in cui avevo bisogno di raccogliere un feedback da un'applicazione Flash che avevo distribuito. Queste forme sembravano un ottimo modo per farlo. Non c'erano costi di hosting per me, i risultati potevano essere facilmente analizzati direttamente dal foglio di calcolo e potrei essere abbastanza sicuro che un servizio di Google come Documenti sarebbe affidabile. L'unico problema era la politica del dominio incrociato.

    

Questo particolare file di criteri non consente l'accesso al dominio http://spreadsheets.google.com/ per le applicazioni Flash remote. E sicuramente, se provi a inviare un modulo a livello di codice da Flash, fallirà.

Questo è un esempio perfetto in cui un proxy può aiutare.


Passaggio 2: creare un'applicazione GAE

Registrati per un account App Engine. Ti verrà chiesto di creare una nuova applicazione. Qui ho creato un'applicazione chiamata activetutsproxydemo. Dovrai scegliere il tuo nome di applicazione univoco.


Passaggio 3: scarica l'SDK GAE

Scarica e installa l'SDK App Engine. Questo installerà un'applicazione chiamata Avvio di Google App Engine. Eseguilo e fai clic File | Crea una nuova applicazione ...

Digitare il nome dell'applicazione creata nel passaggio 1, selezionare un percorso per i file dell'applicazione da memorizzare e fare clic su Creare pulsante.


Passaggio 4: modifica il file main.py

Il programma di avvio di Google App Engine creerà un'applicazione predefinita per te nella directory specificata. Dovresti vedere un file chiamato main.py. Sovrascrivi il contenuto di questo file con il seguente codice Python:

 da google.appengine.ext importazione webapp da google.appengine.ext.webapp.util importazione run_wsgi_app importazione urllib da google.appengine.api importazione classe urlfetch GoogleForm (webapp.RequestHandler): def post (self): destinationURL = "http: / /spreadsheets.google.com/formResponse?formkey=dHh4VTRVbGtSM3ZycUtpbEFKSUJ2Znc6MA&ifq "form_fields = " entry.0.single ": self.request.get ('entry.0.single')," entry.1.single ": self.request .get ('entry.1.single'), "entry.2.single": self.request.get ('entry.2.single'), "entry.3.single": self.request.get (' entry.3.single '), "pageNumber": "0", "backupCache": "", "submit": "Invia" form_data = urllib.urlencode (form_fields) result = urlfetch.fetch (url = destinationURL, payload = form_data, method = urlfetch.POST, headers = 'Content-Type': 'application / x-www-form-urlencoded') print result class CrossDomain (webapp.RequestHandler): def get (self): self.response .headers ['Content-Type'] = 'text / xml' self.response.out.write ("" "   "" ") application = webapp.WSGIApplication ([('/ googleform', GoogleForm), ('/crossdomain.xml', CrossDomain)], debug = True) def main (): run_wsgi_app (applicazione) se __name__ ==" __main__ ": main ()

Puoi trovare ulteriori informazioni su come funziona questo codice nella documentazione di GAE, ma qui evidenzierò i bit importanti.

Questa linea dice che il GoogleForm la classe verrà eseguita quando si accede all'indirizzo http://youapplicationname.appspot.com/googleform e il file crossdomain la classe verrà eseguita quando si accede all'indirizzo http://youapplicationname.appspot.com/crossdomain.xml.

application = webapp.WSGIApplication ([('/ googleform', GoogleForm), ('/crossdomain.xml', CrossDomain)], debug = True)

Il crossdomain class genererà un file di criteri tra domini che consente l'accesso completo al dominio tramite applicazioni Flash remote.

 class CrossDomain (webapp.RequestHandler): def get (self): self.response.headers ['Content-Type'] = 'text / xml' self.response.out.write ("" "   "" ")

Il GoogleForm la classe viene utilizzata per passare la richiesta POST HTTP in arrivo al modulo di Google Documenti.

classe GoogleForm (webapp.RequestHandler): def post (self):

Il destinationUrl variabile definisce l'URL che verrà inviato al modulo (no, questo non è lo stesso dell'URL utilizzato per visualizzare il modulo, ma piuttosto l'URL assegnato al modulo modulo tAG azione attributo.

destinationURL = "http://spreadsheets.google.com/formResponse?formkey=dHh4VTRVbGtSM3ZycUtpbEFKSUJ2Znc6MA&ifq"

Il form_field variabile associa le variabili POST HTTP in arrivo a quelle che devono essere fornite al modulo di Google.

form_fields = "entry.0.single": self.request.get ('entry.0.single'), "entry.1.single": self.request.get ('entry.1.single'), " entry.2.single ": self.request.get ('entry.2.single')," entry.3.single ": self.request.get ('entry.3.single')," pageNumber ":" 0 "," backupCache ":" "," submit ":" Invia "

I dati nei campi sono codificati URL. Questo è un po 'ridondante, perché dovrebbero già essere codificati dall'applicazione Flash quando vengono inviati, ma non fa male assicurarsi.

form_data = urllib.urlencode (form_fields)

I dati vengono quindi ricaricati ai server di Google e il risultato viene salvato in risultato variabile.

result = urlfetch.fetch (url = destinationURL, payload = form_data, metodo = urlfetch.POST, header = 'Content-Type': 'application / x-www-form-urlencoded'))

Il risultato viene quindi stampato, il che ha l'effetto di inviarlo nuovamente all'applicazione Flash.

stampa risultato

Passaggio 5: caricare l'applicazione

Seleziona l'applicazione GAE in Avvio di Google App Engine e fai clic sul pulsante Distribuisci.

Ti verranno richieste le tue credenziali di Google, quindi l'applicazione verrà caricata.


Passaggio 6: verifica la tua applicazione

Vai a http://yourapplicationname.appspot.com/crossdomain.xml (puoi vedere il mio file crossdomain.xml qui). Se tutto è andato bene, dovresti vedere un file XML (potrebbe essere necessario visualizzare l'origine della pagina per vedere il file della politica).

Se vedi qualcosa di simile all'immagine sopra, la tua applicazione web GAE è attiva e funzionante.


Passaggio 7: accesso al modulo con Flex

Il file MXML di seguito è un esempio di come eseguire un'azione HTTP POST utilizzando HTTPService classe.

     

Il variabili variabile associa i nomi delle variabili POST ai dati che verranno inviati.

var variables: Object = new Object (); variables ["entry.0.single"] = "test0"; variables ["entry.1.single"] = "test1"; variables ["entry.2.single"] = "test2"; variables ["entry.3.single"] = "test3";

Quindi creiamo una nuova istanza di HTTPService classe.

servizio var: HTTPService = new HTTPService ();

Dobbiamo specificare a quale URL assegneremo il POST. Per questo primo test, proveremo a inviare direttamente al modulo Google. Questo in realtà fallirà, ma è una buona dimostrazione del motivo per cui abbiamo bisogno di utilizzare un proxy in primo luogo.

service.url = "http://spreadsheets.google.com/formResponse?formkey=dHh4VTRVbGtSM3ZycUtpbEFKSUJ2Znc6MA&ifq";

Noi diciamo al HTTPService obiettare che ci aspettiamo un testo semplice in risposta.

service.resultFormat = HTTPService.RESULT_FORMAT_TEXT;

Dobbiamo anche dire al HTTPService oggetto che vogliamo eseguire un'operazione HTTP POST.

service.method = "POST";

Alcuni gestori di eventi sono configurati per farci sapere se l'operazione è andata a buon fine o meno.

service.addEventListener (ResultEvent.RESULT, function (event: ResultEvent): void Alert.show ("I dati sono stati inviati con successo!");); service.addEventListener (FaultEvent.FAULT, function (event: FaultEvent): void Alert.show ("Si è verificato un errore!"););

Infine, inviamo i dati.

service.send (variabili);

Passaggio 8: compilare l'applicazione

Se compilate ed eseguite l'applicazione usando il pulsante con la freccia verde su di esso, troverete che funziona effettivamente.

Allora, qual è il grosso problema? Perché passare a tutti i problemi della creazione di un proxy? Bene, l'applicazione funzionerà sul computer locale perché la directory / bin-debug / in cui Flex posiziona il file SWF compilato è una posizione attendibile. Ciò significa che l'applicazione sarà in grado di accedere al server di Google. Per simulare come l'applicazione potrebbe funzionare su un sito Web anche se è necessario compilare una versione di rilascio.

Ora, quando si esegue il file SWF dalla cartella / bin-release /, si noterà che l'operazione è fallita. Questo è il modo in cui il SWF agirà quando viene caricato su un sito web.


Passaggio 9: utilizzo del proxy

L'utilizzo del proxy GAE è un semplice caso di modifica dell'URL assegnato HTTPService oggetto.

service.url = "http://activetutsproxydemo.appspot.com/googleform";

Ora quando si esegue l'applicazione, dalle directory bin-debug o bin-release, l'operazione verrà completata correttamente.


Conclusione

La creazione di un'applicazione proxy di Google App Engine ti consentirà di accedere facilmente alle risorse sui server che altrimenti escluderebbero le applicazioni Flash. Finché la tua applicazione non richiede massicce risorse, dovresti scoprire che non supererai le soglie per il servizio GAE gratuito.

Tuttavia, non essere tentato di creare un proxy più generalizzato. Mentre sarebbe possibile creare un proxy che utilizzava una variabile speciale per determinare l'URL di destinazione, rendendo l'applicazione in grado di agire come proxy per qualsiasi risorsa, tale server sarebbe presto sfruttato da altri sviluppatori. Qui abbiamo codificato l'URL di destinazione, nel senso che nel peggiore dei casi qualcuno potrebbe utilizzare questo proxy per passare i dati al modulo di Google Documenti. Ciò lo rende di scarso utilizzo per chiunque altro e riduce la probabilità che il servizio venga abusato.

Spero che questo tutorial ti sia piaciuto, grazie per la lettura!