Kurztipp Verwenden von Google App Engine als Proxy-Server

Google App Engine kann kostenlos und bequem um restriktive oder fehlende domänenübergreifende Richtliniendateien verwendet werden. In diesem Lernprogramm erfahren Sie, wie Sie einen GAE-Proxy erstellen, der Zugriff auf eingeschränkte Ressourcen für Ihre Flash-Anwendung bietet.


Endergebnisvorschau

Werfen wir einen Blick auf das Endergebnis, auf das wir hinarbeiten:

Das sind nur einige Testdaten an eine Remote-Tabelle, die in Google Docs gehostet wird. Ohne eine crossdomain.xml-Datei in der empfangenden Domäne würde dies nicht funktionieren. Die domänenübergreifende Richtliniendatei in Google Docs lässt dies jedoch nicht zu und ich kann sie nicht ändern. Lesen Sie weiter, um herauszufinden, wie das gemacht wurde.


Warum einen Proxy verwenden??

In meinem letzten Schnelltipp Ein Handbuch zu domänenübergreifenden Richtliniendateien Ich habe Ihnen gezeigt, wie domänenübergreifende Richtliniendateien von Flash verwendet werden, um zu bestimmen, auf welche Daten von entfernten Domänen aus zugegriffen werden kann. Die Möglichkeit, den Zugriff auf Ressourcen zu steuern, ist zwar für Administratoren von Vorteil, für Flash-Entwickler ist es jedoch ein Problem, auf Daten auf einem Server zuzugreifen, der keine domänenübergreifende Richtliniendatei hat, da keine Richtliniendatei keinen Zugriff bedeutet. Das Einrichten einer domänenübergreifenden Richtliniendatei kann leicht übersehen werden, und ich bin auf mehr als einen Webdienstanbieter gestoßen, der nicht für Flash-Entwickler gedacht war.

Ich erwähnte auch, dass das Problem durch die Verwendung eines Proxy leicht umgangen werden konnte. Die Idee hinter einem Proxy ist, dass er Verbindungen von Remote-Flash-Anwendungen akzeptiert (indem er die entsprechende crossdomain.xml-Datei bereitstellt) und dann als Vermittler fungiert, der Daten hin- und herleitet. Die einzige reale Anforderung eines Proxyservers (in Bezug auf Flash) ist, dass er auf öffentliche Ressourcen zugreifen kann, unabhängig von den Berechtigungen, die von einer domänenübergreifenden Richtlinie erteilt werden können oder nicht.

Die wirklich gute Nachricht ist, dass Sie mit Google App Engine (GAE) einen solchen Proxy ohne Anschaffungskosten einrichten können. GAE wird eine Webanwendung hosten und vorausgesetzt, dass Ihre Verkehrsanforderungen unter ihrem Schwellenwert liegen, fallen keine Gebühren an. Ich werde hier demonstrieren, wie Sie eine einfache GAE-Webanwendung erstellen, die als Proxy fungieren kann und Flash-Anwendungen den Zugriff auf Ressourcen ermöglicht, die ansonsten nicht zulässig sind.


Schritt 1: Google Spreadsheets und die gefürchtete crossdomain.xml

In Google Text & Tabellen gibt es eine wirklich nette Funktion, mit der Sie ein Webformular erstellen können, mit dem eine Tabelle gefüllt werden kann. Ich habe hier ein solches Formular eingerichtet, dessen Ergebnisse hier als öffentliche Webseite veröffentlicht werden. Das Formular ist ein Standard-HTML-Formular, das programmgesteuert mithilfe eines Standard-HTTP-POST-Vorgangs übermittelt werden kann.

Ich war kürzlich in einer Position, in der ich etwas Feedback von einer Flash-Anwendung sammeln musste, die ich verteilt hatte. Diese Formen waren ein guter Weg, dies zu tun. Es gab keine Hosting-Kosten für mich, die Ergebnisse ließen sich leicht direkt in der Kalkulationstabelle analysieren und ich war mir ziemlich sicher, dass ein Google-Dienst wie Docs zuverlässig ist. Das einzige Problem war die domänenübergreifende Richtlinie.

    

Diese bestimmte Richtliniendatei ermöglicht keinen Zugriff auf die Domäne http://spreadsheets.google.com/ für Flash-Remote-Anwendungen. Wenn Sie versuchen, ein Formular programmgesteuert aus Flash zu senden, schlägt dies fehl.

Dies ist ein perfektes Beispiel, wo ein Proxy helfen kann.


Schritt 2: Erstellen Sie eine GAE-Anwendung

Melden Sie sich für ein App Engine-Konto an. Sie werden aufgefordert, eine neue Anwendung zu erstellen. Hier habe ich eine Anwendung mit dem Namen activetutsproxydemo erstellt. Sie müssen Ihren eigenen eindeutigen Anwendungsnamen auswählen.


Schritt 3: Holen Sie sich das GAE SDK

Laden Sie das App Engine SDK herunter und installieren Sie es. Dadurch wird eine Anwendung namens Google App Engine Launcher installiert. Führen Sie es aus und klicken Sie auf Datei | Neue Anwendung erstellen…

Geben Sie den Namen der Anwendung ein, die Sie in Schritt 1 erstellt haben, wählen Sie einen Speicherort für die zu speichernden Anwendungsdateien aus und klicken Sie auf Erstellen Taste.


Schritt 4: Ändern Sie die Datei main.py

Der Google App Engine Launcher erstellt eine Standardanwendung für Sie in dem von Ihnen angegebenen Verzeichnis. Sie sollten eine Datei namens main.py sehen. Überschreiben Sie den Inhalt dieser Datei mit dem folgenden Python-Code:

 von google.appengine.ext import webapp von google.appengine.ext.webapp.util import run_wsgi_app import urllib von google.appengine.api import urlfetch-Klasse 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 " .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" 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') Ergebnisklasse drucken 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 (application) wenn __name__ ==" __Haupt Haupt()

Weitere Informationen zur Funktionsweise dieses Codes finden Sie in der GAE-Dokumentation. Ich möchte hier jedoch die wichtigsten Punkte hervorheben.

Diese Zeile besagt, dass die GoogleForm Die Klasse wird ausgeführt, wenn auf die Adresse http://youapplicationname.appspot.com/googleform zugegriffen wird, und die CrossDomain Die Klasse wird ausgeführt, wenn auf die Adresse http://youapplicationname.appspot.com/crossdomain.xml zugegriffen wird.

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

Das CrossDomain class gibt eine domänenübergreifende Richtliniendatei aus, die uneingeschränkten Zugriff auf die Domäne durch Flash-Remoteanwendungen ermöglicht.

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

Das GoogleForm Diese Klasse wird verwendet, um die eingehende HTTP-POST-Anforderung an das Google Docs-Formular zu übergeben.

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

Das Ziel-URL Variable definiert die URL, unter der das Formular veröffentlicht wird (nein, dies ist nicht die URL, die zum Anzeigen des Formulars verwendet wird), sondern die URL, die dem Formular zugewiesen ist bilden Stichworte Aktion Attribut.

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

Das form_fields Variable ordnet die eingehenden HTTP-POST-Variablen denjenigen zu, die an das Google-Formular übermittelt werden müssen.

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 "

Die Daten in den Feldern sind URL-kodiert. Dies ist ein wenig überflüssig, da sie beim Senden bereits von der Flash-Anwendung codiert werden sollten.

form_data = urllib.urlencode (form_fields)

Die Daten werden dann erneut an die Google-Server gepostet und das Ergebnis wird auf dem Server gespeichert Ergebnis Variable.

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

Das Ergebnis wird dann gedruckt, wodurch es an die Flash-Anwendung zurückgesendet wird.

Ergebnis drucken

Schritt 5: Laden Sie die Anwendung hoch

Wählen Sie Ihre GAE-Anwendung im Google App Engine Launcher aus und klicken Sie auf die Schaltfläche "Bereitstellen".

Sie werden aufgefordert, Ihre Google-Anmeldeinformationen einzugeben. Anschließend wird die Anwendung hochgeladen.


Schritt 6: Testen Sie Ihre Anwendung

Gehen Sie zu http://ihrapplicationname.appspot.com/crossdomain.xml (Sie können meine crossdomain.xml-Datei hier sehen). Wenn alles gut lief, sollten Sie eine XML-Datei sehen (möglicherweise müssen Sie die Seitenquelle anzeigen, um die Richtliniendatei anzuzeigen)..

Wenn Sie etwas sehen, das dem obigen Bild ähnlich ist, ist Ihre GAE-Webanwendung betriebsbereit.


Schritt 7: Mit Flex auf das Formular zugreifen

Die unten stehende MXML-Datei ist ein Beispiel für die Durchführung einer HTTP-POST-Aktion mithilfe von HTTPService Klasse.

     

Das Variablen Variable ordnet die Namen der POST-Variablen den zu sendenden Daten zu.

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

Als Nächstes erstellen wir eine neue Instanz von HTTPService Klasse.

var service: HTTPService = neuer HTTPService ();

Wir müssen angeben, an welche URL wir POST senden. Für diesen ersten Test versuchen wir das POST direkt in das Google-Formular. Das wird tatsächlich fehlschlagen, aber es ist eine gute Demonstration, warum wir überhaupt einen Proxy verwenden müssen.

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

Wir sagen dem HTTPService Objekt, dass wir als Antwort Klartext erwarten.

service.resultFormat = HTTPService.RESULT_FORMAT_TEXT;

Wir müssen auch das sagen HTTPService Objekt, das wir eine HTTP-POST-Operation durchführen möchten.

service.method = "POST";

Einige Event-Handler sind so eingerichtet, dass sie uns mitteilen, ob die Operation erfolgreich war oder nicht.

service.addEventListener (ResultEvent.RESULT, Funktion (Ereignis: ResultEvent): void Alert.show ("Daten wurden erfolgreich gesendet!");); service.addEventListener (FaultEvent.FAULT, Funktion (Ereignis: FaultEvent): void Alert.show ("Es ist ein Fehler aufgetreten!"););

Zum Schluss senden wir die Daten ab.

service.send (Variablen);

Schritt 8: Kompilieren Sie die Anwendung

Wenn Sie die Anwendung mit der Schaltfläche mit dem grünen Pfeil kompilieren und ausführen, werden Sie feststellen, dass sie tatsächlich funktioniert.

Was ist also die große Sache? Warum sollten Sie sich die Mühe machen, einen Proxy zu erstellen? Die Anwendung funktioniert auf Ihrem lokalen Computer, da das Verzeichnis / bin-debug /, in dem Flex die kompilierte SWF-Datei ablegt, ein vertrauenswürdiger Speicherort ist. Dies bedeutet, dass die Anwendung auf den Google-Server zugreifen kann. Um zu simulieren, wie die Anwendung auf einer Website funktionieren würde, müssen Sie eine Release-Version erstellen.

Wenn Sie nun die SWF-Datei aus dem Ordner / bin-release / ausführen, wird der Vorgang fehlgeschlagen. So verhält sich die SWF-Datei, wenn sie auf eine Website hochgeladen wird.


Schritt 9: Verwenden des Proxy

Die Verwendung des GAE-Proxys ist ein einfacher Fall, in dem die URL geändert wird, die dem zugewiesen ist HTTPService Objekt.

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

Wenn Sie nun die Anwendung entweder aus den Verzeichnissen bin-debug oder bin-release ausführen, wird der Vorgang erfolgreich abgeschlossen.


Fazit

Durch das Erstellen einer Google App Engine-Proxy-Anwendung können Sie leicht auf Ressourcen auf Servern zugreifen, die sonst Flash-Anwendungen ausschließen würden. Solange Ihre Anwendung keine umfangreichen Ressourcen anfordert, sollten Sie feststellen, dass Sie die Schwellenwerte für den kostenlosen GAE-Dienst nicht überschreiten.

Seien Sie jedoch nicht versucht, einen allgemeineren Proxy zu erstellen. Während es möglich wäre, einen Proxy zu erstellen, der eine spezielle Variable zur Bestimmung der Ziel-URL verwendet, wodurch die Anwendung als Proxy für jede Ressource fungieren kann, wird ein solcher Server von anderen Entwicklern schnell ausgenutzt. Hier haben wir die Ziel-URL hart codiert, was bedeutet, dass im schlimmsten Fall jemand diesen Proxy verwenden kann, um Daten an das Google Docs-Formular zu übergeben. Dies macht es für niemanden von Nutzen und verringert die Wahrscheinlichkeit, dass der Dienst missbraucht wird.

Ich hoffe, Ihnen hat dieses Tutorial gefallen, danke fürs Lesen!