Domanda

Sto provando a ottenere l'URL del server di un'app java appengine attualmente in esecuzione dal codice. Cioè, se l'app è in esecuzione sul mio computer di sviluppo locale, vorrei in qualche modo essere restituita " http: // localhost: 8080 " ma se è in esecuzione in prod vorrei essere restituito " http://myappid.appspot.com " ;. Ci sono API Java o Appengine che possono farlo? Mi piacerebbe non dover modificare e leggere manualmente da un file di configurazione o una costante.

Grazie.

  • Aleem
È stato utile?

Soluzione

Dovresti essere in grado di usare getServerName ():

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

Esistono altri metodi che è possibile utilizzare anche se sono necessarie ulteriori informazioni, ad es. getServerPort ().

Altri suggerimenti

Questo funziona per me in Java su 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";
}

Ecco un paio di modi per farlo nel gestore delle richieste (se stai usando il framework elementare webapp fornito):

  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')

Questo emette 'localhost: 8081' o 'blabla.appspot.com' come prima riga e come seconda come l'URI completo invece, ad es. ' http: // localhost: 8081 / zup ' o ' http://blabla.appspot.com/zup '.

Più in generale, è possibile utilizzare wsgiref.util per estrarre facilmente le informazioni da qualsiasi ambiente WSGI, e poiché App Engine funziona su WSGI ci dovrebbero essere sempre modi semplici per estrarre un tale ambiente da le grinfie di qualunque quadro tu abbia scelto ;-)

So che è stata data una risposta, ma un'altra da aggiungere al mix;

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 + "/";

Riferimento: https://cloud.google.com/appengine/docs / java / AppIdentity / # Java_Asserting_identity_to_other_App_Engine_apps

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top