2009-06-18 12 views
9

Ich versuche, die Server-URL einer laufenden appengine Java App aus dem Code zu bekommen. Das heißt, wenn die App auf meinem lokalen Dev-Computer ausgeführt wird, möchte ich irgendwie "http://localhost:8080" zurückgegeben werden, aber wenn es in prod ausgeführt wird, möchte ich "http://myappid.appspot.com" zurückgegeben werden. Gibt es Java oder Appengine APIs, die das können? Ich möchte nicht haben, manuell von einer Konfigurationsdatei oder von einer Konstante zu ändern und zu lesen.Wie erhalte ich die aktuelle Server URL der appengine App?

Danke.

  • Aleem

Antwort

7

Sie sollten getServerName() in der Lage sein zu verwenden:

boolean local = "localhost".equals(httpServletRequest.getServerName()); 

Es gibt andere Methoden, die Sie auch, wenn Sie mehr benötigen Informationen verwenden können, zB getServerPort().

+0

Großartig, das hat funktioniert - danke! – aloo

8

Hier ein paar Art und Weise ist es in Ihrem Request-Handler zu tun (wenn Sie das mitgelieferte webapp elementaren Framework verwenden):

def get(self): 
    self.response.out.write(self.request.headers.get('host', 'no host')) 
    self.response.out.write('<br>\n') 
    who = wsgiref.util.request_uri(self.request.environ) 
    self.response.out.write(who + '<br>\n') 

Dieses emittiert ‚localhost: 8081 'oder' blabla.appspot.com 'als erste Zeile, und als zweite wie die komplette URI stattdessen, z 'http://localhost:8081/zup' oder 'http://blabla.appspot.com/zup'.

Allgemein können Sie wsgiref.util verwenden, um einfach Informationen aus jeder WSGI-Umgebung zu extrahieren, und da App Engine auf WSGI aufsetzt, sollte es immer einfache Möglichkeiten geben, eine solche Umgebung aus den Fängen eines beliebigen Frameworks herauszuholen gewählt ;-)

+1

Java, Python nicht! –

+9

Vielen Dank für die Antwort von Python, als jemand, der in Python nach der Antwort gesucht hat. –

+1

@Gordon, froh, dass sich dies als nützlich erwiesen hat (obwohl ich die Tags nicht richtig beachtet hatte!). –

10

Das ist für mich arbeitet in Java auf appengine:

String hostUrl; 
String environment = System.getProperty("com.google.appengine.runtime.environment"); 
if (StringUtils.equals("Production", environment)) { 
    String applicationId = System.getProperty("com.google.appengine.application.id"); 
    String version = System.getProperty("com.google.appengine.application.version"); 
    hostUrl = "http://"+version+"."+applicationId+".appspot.com/"; 
} else { 
    hostUrl = "http://localhost:8888"; 
} 
+1

StringUtils.equals?! –

0

Ich weiß, das beantwortet wurde, aber ein anderer in der Mischung zu werfen;

import com.google.apphosting.api.ApiProxy; 

... 

final ApiProxy.Environment env = ApiProxy.getCurrentEnvironment(); 
final Map<String, Object> attributes = env.getAttributes(); 
final String hostAndPort = (String) attributes.get("com.google.appengine.runtime.default_version_hostname"); 
final String url = "http://" + hostAndPort + "/"; 

Referenz: https://cloud.google.com/appengine/docs/java/appidentity/#Java_Asserting_identity_to_other_App_Engine_apps

Verwandte Themen