Par exemple, si j'ai le contrôleur suivant:
import io.micronaut.http.MediaType; import io.micronaut.http.annotation.*; @Controller("/test") public class TestController { @Get() @Produces(MediaType.TEXT_PLAIN) public String index() { // How should this be implemented? return "???"; } }
et que je l'exécute sur mon-serveur, alors je voudrais que la méthode d'index retourne http: // mon-serveur: 8080 .
3 Réponses :
Cela semble fonctionner:
import io.micronaut.http.MediaType; import io.micronaut.http.annotation.*; import io.micronaut.runtime.server.EmbeddedServer; import io.micronaut.web.router.RouteBuilder; import java.net.*; @Controller("/test") public class TestController { protected final String baseUrl; public TestController(EmbeddedServer embeddedServer, RouteBuilder.UriNamingStrategy uns) throws MalformedURLException { final String host = embeddedServer.getHost(); final int port = embeddedServer.getPort(); final String file = uns.resolveUri(TestController.class); baseUrl = new URL("http", host, port, file).toString(); } @Get() @Produces(MediaType.TEXT_PLAIN) public String index() { return baseUrl; } }
Je ne sais pas si c'est idiomatique ou si cela fonctionne dans tous les cas. Si quelqu'un publie une meilleure réponse, je l'accepterai.
Savez-vous quel gestionnaire est en charge de votre annotation @Controller avec le chemin donné. Cela a trouvé, je pense que vous pouvez peut-être trouver comment toute l'URL est construite pour la récupérer?
Vous pouvez éliminer une bonne partie de cela en appelant URL intégrée Server.get ()
au lieu d'appeler getHost ()
, getPort ()
etc. et le reconstituer par vous-même.
Merci. Je viens de découvrir HttpHostResolver
dans la version 1.2.0, ce qui semble être une approche plus idiomatique.
Si vous souhaitez que le contrôleur réponde à /
, utilisez @Controller ("/")
au lieu de @Controller ("/ test") code>.
Je ne sais pas comment cela se rapporte à ma question.
Vous avez dit "alors je voudrais que la méthode index renvoie mon-serveur: 8080 " et j'ai pensé que cela signifiait que vous voulait que la méthode d'index soit exécutée lorsque vous avez envoyé une requête à http: // mon-serveur: 8080
.
Je vois maintenant. Je comprends la question. J'ai mal compris au départ. Je m'excuse pour le bruit.
Souhaitez-vous renvoyer le nom d'hôte et le port de l'hôte sur lequel l'application s'exécute ou souhaitez-vous renvoyer l'url de base de la manière dont votre API est accessible (par exemple derrière un proxy)?
@ saw303 le dernier serait préférable, mais le premier est assez bon pour le moment.