2009-06-18 5 views
9

J'essaie d'obtenir l'URL du serveur d'une application appengine java en cours d'exécution à partir du code. Autrement dit, si l'application est en cours d'exécution sur ma machine de développement local, je voudrais en quelque sorte être renvoyé "http://localhost:8080" mais si elle fonctionne en prod je voudrais être retourné "http://myappid.appspot.com". Existe-t-il des API Java ou Appengine capables de faire cela? Je ne voudrais pas avoir à changer et lire manuellement à partir d'un fichier de configuration ou d'une constante.Comment obtenir l'URL actuelle du serveur de l'application appengine?

Merci.

  • Aleem

Répondre

7

vous devriez pouvoir utiliser getServerName():

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

Il existe d'autres méthodes que vous pouvez utiliser si vous avez besoin de plus d'information, par exemple getServerPort().

+0

Super qui a fonctionné - merci! – aloo

8

Voici quelques façon de le faire dans votre gestionnaire de requêtes (si vous utilisez la condition webapp cadre élémentaire):

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

Ce « émet localhost: 8081 'ou' blabla.appspot.com 'en tant que première ligne, et en tant que seconde comme l'URI complète à la place, par exemple 'http://localhost:8081/zup' ou 'http://blabla.appspot.com/zup'. Plus généralement, vous pouvez utiliser wsgiref.util pour extraire facilement des informations de n'importe quel environnement WSGI, et puisque App Engine sert au-dessus de WSGI, il devrait toujours y avoir des moyens faciles de forcer un tel environnement à partir des griffes du cadre que vous avez. choisi ;-)

+1

Java, pas Python! –

+9

Merci de donner la réponse Python, cependant, comme quelqu'un qui est venu chercher la réponse en Python. –

+1

@Gordon, heureux que cela vous soit utile (même si je n'avais pas pris bonne note des tags!). –

10

Cela fonctionne pour moi en Java sur 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

Je sais que cela a été répondu, mais un autre à jeter au mélange;

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

Référence: https://cloud.google.com/appengine/docs/java/appidentity/#Java_Asserting_identity_to_other_App_Engine_apps

Questions connexes