2016-04-05 4 views
0

Haben Sie eine Anwendung, die mit dem in ExtJS erstellten Frontend ausgeführt wird, während das Backend mit Grails erstellt wird.Running Grails und Sencha ExtJS in einem Tomcat

Die ExtJS-Anwendung wird von der Windows-Befehlszeile unter Verwendung von sencha app build dann sencha web start erstellt und bereitgestellt, die die Anwendung auf Port 80 startet. Alles gut. Als nächstes wird die Grails-Anwendung durch IntelliJ (Run->Run 'Application') ausgeführt, aber das läuft in Port 8080.

Wie ist es möglich, die Dienste in Grails von der ExtJS-Anwendung aufrufen, da es davon abhängt, unter dem gleichen Port zu sein? Gibt es eine Möglichkeit, die Anwendungen unter einer Tomcat-Instanz über einen vhost zu verteilen?

+0

Fragen Sie nur nach Entwicklungsumgebung? – JChap

Antwort

0

Sie können Ihre ExtJS dazu bringen, Anrufe an andere Ports zu tätigen, indem Sie CORS sowohl auf der Server- als auch auf der Client-Seite aktivieren.

Grails

Um CORS auf Grails Seite können Sie dieses plugin installieren und die folgende Konfiguration zu Ihrem Config.groovy hinzuzufügen. Grundsätzlich sagen wir, dass jede Domain Anfragen an diese Anwendung stellen kann.

cors { 
    enabled = true 
    url.pattern = '*' 
    allow.origin.regex = '.*' 
    headers=[ 
     'Access-Control-Allow-Headers': 'origin, authorization, accept, cookie, set-cookie, content-type, x-requested-with', 
     'Access-Control-Allow-Methods': 'GET, HEAD, POST, PUT, DELETE, TRACE, OPTIONS', 
     'Access-Control-Max-Age': 3600 
    ] 
} 

ExtJS

Wir brauchen auch die CORS auf ExtJS Seite zu ermöglichen, dies zu tun, können wir einfach einen beforerequest Hörer für alle AJAX-Anforderungen hinzufügen. Außerdem bevorzuge ich einen gemeinsamen Ort, an dem ich meine API-URL konfigurieren kann. Anstatt also die API-URL an allen Stellen wie Proxys zu definieren, können wir ajax-Anfragen zentralisieren.

Sie können das tun, indem Sie den folgenden Code in der Startmethode Ihrer Anwendung hinzufügen.

var API_URL = 'http://localhost:8080/grailsappp' 
Ext.Ajax.on({ 
    beforerequest: function(conn, opts){   
     if(opts.url) { 
      opts.url = API_URL + opts.url; 
     } 
     conn.setCors(true); 
    } 
}); 
+0

Danke! Damit habe ich einen Teil geschafft. Jetzt ruft der Back-End-Dienst über ExtJS auf. Einziges Problem ist der CORS-Teil ist immer noch etwas verwirrend. Ich habe es auf der Grails Seite hinzugefügt (ich benutze v3.0.2) Wie bereits erwähnt, werden die Anfragen jedoch weiterhin als OPTIONS anstatt als POST von ExtJS gesendet. – Syam

+0

Ja mit CORS aktiviert, wird es zwei Anfragen senden. Einer ist die Preflight-Anfrage (OPTIONS) und der andere ist die eigentliche Anfrage (POST). – JChap

0

Der Sencha Web Start-Befehl ist nutzlos, wenn Sie ein Backend haben, das nicht node.js ist.

Für Web-Server ist ExtJS nichts anderes als statische Dateien, da es vom Browser bedient und interpretiert wird. Ich weiß nicht speziell über Tomcat/Grails, aber jeder Webserver sollte in der Lage sein, statische Dateien irgendwie zu liefern.

Ich verwende zum Beispiel ASP.NET-Backend, und ich habe die ExtJS-Dateien zum Arbeitsverzeichnis des ASP.NET-Projekts hinzugefügt. Wenn ich also debuggen möchte, starte ich den Backend-Debug-Prozess lokal von VisualStudio, und ich kann die statischen Javascript-Dateien laden, die dann auf den Backend-Prozess zugreifen können. Ich habe nie Sencha Web Start verwendet, denn wie gesagt, wenn Sie ein Backend haben, das nicht node.js ist, ist es nutzlos.

Sie müssten das gleiche für Tomcat/Grails tun. Wie man das erreicht, ist eine reine Tomcat/Grails-Frage, die mit ExtJS nichts zu tun hat.

+0

NodeJS ist leider für uns keine Option, da das Projekt mit dem Grails-Framework für das Backend gestartet wurde. Auf unseren lokalen Rechnern zu debuggen ist, wo wir Probleme haben. Die ExtJS-Anwendung stellt eine Verbindung zum Grails-App-Backend her, die Aufrufe der Grails-App von ExtJS stammen jedoch vom standardmäßigen ExtJS-Port, nicht vom Port, auf dem die Grails-Anwendung ausgeführt wird. – Syam

+0

Ich erweiterte meine Antwort ein wenig. – Alexander

Verwandte Themen