Snabbtips Använda Google App Engine som en proxyserver

Google App Engine kan användas som ett gratis och bekvämt sätt kring restriktiva eller saknade korsdomänpolicyfiler. Denna handledning visar hur du skapar en GAE-proxy som ger tillgång till begränsade resurser till din Flash-applikation.


Slutresultatförhandsvisning

Låt oss ta en titt på det slutliga resultatet vi ska arbeta för:

Det har just skickats några testdata till ett avlägset kalkylblad som finns på Google Dokument. Det här skulle inte fungera utan en crossdomain.xml-fil på den mottagande domänen - ändå tillåter inte korsdomänpolicyfilen i Google Dokument det här, och jag kan inte ändra det. Läs vidare för att få reda på hur detta gjordes.


Varför använda en proxy?

I min senaste Snabba Tips En Guide till Cross Domain Policy Filer visade jag dig hur Cross Domain Policy-filer används av Flash för att bestämma vilka data som kan nås från fjärrdomäner. Medan du kan kontrollera tillgången till resurser är det bra för administratörer, det är en smärta för Flash-utvecklare som försöker få åtkomst till data på en server som inte har en korsdomänpolicyfil eftersom ingen policyfil betyder ingen åtkomst. Konfigurera en fil med korsdomänpolicy kan enkelt överskådas och jag har stött på fler än en leverantör av webbtjänster som inte trodde att de kunde tillgodose Flash-utvecklare.

Jag nämnde också att problemet var lätt att kringgå genom att använda en proxy. Tanken bakom en proxy är att den kommer att acceptera anslutningar från fjärranslutna Flash-applikationer (genom att tillhandahålla lämplig crossdomain.xml-fil) och sedan fungera som en mellanliggande överföring av data fram och tillbaka. Det enda verkliga kravet på en proxyserver (som det gäller Flash) är att den ska kunna få tillgång till offentliga resurser oavsett de behörigheter som eventuellt kan beviljas av en korsdomänpolicy.

Den riktigt goda nyheten är att du kan installera en sådan proxy utan uppehållskostnader med hjälp av Google App Engine (GAE). GAE kommer att vara värd för en webbapplikation, och om dina trafikkrav är under deras tröskelvärde, är det ingen kostnad. Vad jag kommer att demonstrera här är hur man skapar en enkel GAE-webbapplikation som kan fungera som en proxy, så att Flash-applikationer får tillgång till resurser som annars skulle vara begränsade.


Steg 1: Google kalkylblad och den skrämmande crossdomain.xml

Det finns en riktigt snygg funktion i Google Dokument som låter dig skapa ett webbformulär som kan användas för att fylla i ett kalkylblad. Jag har satt upp enbart en sådan blankett här, med resultaten av denna blankett publicerad som en offentlig webbsida här. Formuläret är en standard HTML-blankett, som kan skickas programmatiskt med hjälp av en standard HTTP POST-operation.

Jag var nyligen i en position där jag behövde samla lite feedback från en Flash-applikation som jag hade distribuerat. Dessa former verkade som ett bra sätt att göra det. Det fanns inga hostingkostnader för mig, resultaten kunde lätt analyseras direkt av kalkylbladet, och jag kunde vara ganska säker på att en Google-tjänst som Docs skulle vara tillförlitlig. Det enda problemet var korsdomänpolitiken.

    

Den här specifika policyfilen tillåter ingen åtkomst till http://spreadsheets.google.com/ domän för fjärranslutna Flash-program. Och säkert, om du försöker skicka in ett formulär programmatiskt från Flash, kommer det att misslyckas.

Detta är ett perfekt exempel där en proxy kan hjälpa.


Steg 2: Skapa en GAE-applikation

Registrera dig för ett App Engine-konto. Du kommer att bli ombedd att skapa en ny applikation. Här har jag skapat en ansökan som heter activetutsproxydemo. Du måste välja ditt eget unika programnamn.


Steg 3: Få GAE SDK

Hämta och installera App Engine SDK. Det här installerar en applikation som heter Google App Engine Launcher. Kör det och klicka Fil | Skapa ny applikation ...

Skriv in namnet på programmet du skapade i steg 1, välj en plats för att programmets filer ska sparas och klicka på Skapa knapp.


Steg 4: Ändra main.py-filen

Google App Engine Launcher skapar en standardprogram för dig i den katalog du angav. Du borde se en fil som heter main.py. Skriv om innehållet i den här filen med följande Python-kod:

 från google.appengine.ext importera webapp från google.appengine.ext.webapp.util import run_wsgi_app importera urllib från google.appengine.api importera urlfetch-klassen 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_number ")," pageNumber ":" 0 "," backupCache ":" "," Skicka ":" Skicka " form_data = urllib.urlencode (form_fields) result = urlfetch.fetch (url = destinationURL, nyttolast = form_data, method = urlfetch.POST, headers = 'Content-Type': 'application / x-www-form-urlencoded') Skriv ut resultatklass CrossDomain (webapp.RequestHandler): def get (self) .headers ['Content-Type'] = 'text / xml' self.response.out.write ("" "   ("/crossdomain.xml", CrossDomain)], debug = True) def main (): run_wsgi_app (ansökan) om __name__ == " __main__ ": main ()

Du kan hitta mer information om hur denna kod fungerar i GAE-dokumentationen, men jag markerar viktiga bitar här.

Denna linje säger att GoogleForm klassen kommer att köras när http://youapplicationname.appspot.com/googleform-adressen är tillgänglig och CrossDomain klassen kommer att utföras när http://youapplicationname.appspot.com/crossdomain.xml adressen är tillgänglig.

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

De CrossDomain klassen kommer att mata ut en korsdomänpolicyfil som tillåter fullständig åtkomst till domänen genom fjärrprogram i Flash.

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

De GoogleForm klassen används för att skicka den inkommande HTTP POST-förfrågan till formuläret Google Dokument.

klass GoogleForm (webapp.RequestHandler): def post (själv):

De destinationUrl variabel definierar webbadressen som formuläret ska posta till (nej, det här är inte detsamma som webbadressen som användes för att visa formuläret, utan snarare den URL som tilldelats form taggens verkan attribut.

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

De form_fields variabel kartor de inkommande HTTP POST-variablerna med dem som behöver levereras till Googles formulär.

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 ":" Submit "

Uppgifterna i fälten är URL-kodade. Detta är lite överflödigt, eftersom de redan ska kodas av Flash-applikationen när de skickas, men det gör inte ont för att vara säker.

form_data = urllib.urlencode (form_fields)

Därefter återpostas data till Googles servrar, och resultatet sparas i resultat variabel.

result = urlfetch.fetch (url = destinationURL, nyttolast = form_data, metod = urlfetch.POST, rubriker = 'Content-Type': 'application / x-www-form-urlencoded')

Resultatet skrivs sedan ut, vilket medför att det skickas tillbaka till Flash-applikationen.

utskriftsresultat

Steg 5: Ladda upp programmet

Välj din GAE-applikation i Google App Engine Launcher och klicka på knappen Implementera.

Du kommer att be om din Google-behörighet, och sedan laddas programmet upp.


Steg 6: Testa din ansökan

Gå till http://yourapplicationname.appspot.com/crossdomain.xml (du kan se min crossdomain.xml-fil här). Om allt gick bra borde du se en XML-fil (du kan behöva se sidkällan för att se policyfilen).

Om du ser något som liknar bilden ovan är din GAE webbapplikation igång.


Steg 7: Åtkomst till formuläret med Flex

MXML-filen nedan är ett exempel på hur man gör en HTTP POST-åtgärd med hjälp av HTTPService klass.

     

De variabler variabla kartor variabelnamnenPOST till de data som ska skickas.

var-variabler: Objekt = nytt objekt (); variabler ["entry.0.single"] = "test0"; variabler ["entry.1.single"] = "test1"; variabler ["entry.2.single"] = "test2"; variabler ["entry.3.single"] = "test3";

Nästa skapar vi en ny instans av HTTPService klass.

var tjänst: HTTPService = ny HTTPService ();

Vi måste ange vilken webbadress vi ska POSTa till. För detta första test kommer vi att försöka POSTa till Google-formuläret direkt. Detta kommer faktiskt misslyckas, men det är en bra demonstration av varför vi måste använda en proxy i första hand.

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

Vi berättar för HTTPService anmärka att vi förväntar oss ren text som svar.

service.resultFormat = HTTPService.RESULT_FORMAT_TEXT;

Vi måste också berätta för HTTPService objekt att vi vill utföra en HTTP POST-operation.

service.method = "POST";

Vissa händelsehanterare är inställda för att meddela om verksamheten lyckades eller inte.

service.addEventListener (ResultEvent.RESULT, funktion (händelse: ResultEvent): void Alert.show ("Data skickades framgångsrikt!");); service.addEventListener (FaultEvent.FAULT, funktion (händelse: FaultEvent): void Alert.show ("Det fanns ett fel!"););

Slutligen skickar vi data av.

service.send (variabler);

Steg 8: Kompilera ansökan

Om du kompilerar och kör programmet med knappen med den gröna pilen på den, kommer du att upptäcka att den faktiskt fungerar.

Så vad är big deal? Varför gå till alla problem med att skapa en proxy? Tja, programmet kommer att fungera på din lokala maskin eftersom den / bin-debug / katalogen där Flex placerar den sammanställda SWF-en är en betrodd plats. Det innebär att programmet kommer att kunna komma åt Googles server. För att simulera hur ansökan skulle fungera på en webbplats, trots att du måste sammanställa en release version.

Nu när du kör SWF från / bin-release / mappen ser du att åtgärden har misslyckats. Så här fungerar SWF när den laddas upp till en webbplats.


Steg 9: Använda proxyn

Använda GAE-proxy är ett enkelt fall med att ändra webbadressen som tilldelats till HTTPService objekt.

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

Nu när du kör programmet, antingen från bin-debug eller bin-release-kataloger, kommer operationen att slutföras.


Slutsats

Genom att skapa en programprogram för Google App Engine kan du enkelt få tillgång till resurser på servrar som annars skulle utesluta Flash-program. Så länge din ansökan inte begär massiva resurser bör du upptäcka att du inte kommer att överskrida trösklarna för den kostnadsfria GAE-tjänsten.

Låt dig dock inte frestas att skapa en mer generaliserad proxy. Även om det skulle vara möjligt att skapa en proxy som använde en särskild variabel för att bestämma destinationsadressen, vilket gör att programmet kan fungera som en proxy för någon resurs, skulle en sådan server snabbt utnyttjas av andra utvecklare. Här har vi svårt kodad destinationsadressen, vilket betyder att det i värsta fall kan någon använda denna proxy för att skicka data till formuläret Google Dokument. Detta gör det till liten nytta för någon annan, och minskar sannolikheten för att tjänsten kommer att missbrukas.

Jag hoppas att du gillade den här handledningen, tack för att du läste!