1
votes

Comment un contrôleur Micronaut détermine-t-il son URL de base

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 .


2 commentaires

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.


3 Réponses :


0
votes

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.


3 commentaires

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.



0
votes

Si vous souhaitez que le contrôleur réponde à / , utilisez @Controller ("/") au lieu de @Controller ("/ test") .


3 commentaires

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.