¿Cómo obtener la URL actual del servidor de la aplicación appengine?
-
06-07-2019 - |
Pregunta
Estoy tratando de obtener la URL del servidor de una aplicación de Java appengine actualmente en ejecución desde el código. Es decir, si la aplicación se está ejecutando en mi máquina de desarrollo local, me gustaría que de alguna manera me devuelvan " http: // localhost: 8080 " pero si se ejecuta en prod me gustaría que me devuelvan " http://myappid.appspot.com " ;. ¿Hay alguna API de Java o appengine que pueda hacer esto? Me gustaría no tener que cambiar y leer manualmente desde un archivo de configuración o una constante.
Gracias.
- Aleem
Solución
Debería poder usar getServerName ():
boolean local = "localhost".equals(httpServletRequest.getServerName());
Existen otros métodos que también puede usar si necesita más información, p. ej. getServerPort ().
Otros consejos
Esto está funcionando para mí en Java en 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";
}
Aquí hay un par de formas de hacerlo en su controlador de solicitudes (si está utilizando el marco elemental webapp
proporcionado):
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')
Esto emite 'localhost: 8081' o 'blabla.appspot.com' como la primera línea, y como la segunda como el URI completo en su lugar, p. ' http: // localhost: 8081 / zup ' o ' http://blabla.appspot.com/zup '.
De manera más general, puede usar wsgiref.util
para extraer fácilmente información de cualquier entorno WSGI, y dado que App Engine sirve sobre WSGI, siempre debe haber formas fáciles de extraer ese entorno de las garras de cualquier marco que hayas elegido ;-)
Sé que esto ha sido respondido, pero otro para agregar a la mezcla;
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 + "/";