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.