Come ottenere l'URL del server corrente dell'app appengine?
-
06-07-2019 - |
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
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