【问题标题】:How does a Micronaut controller determine its base URLMicronaut 控制器如何确定其基本 URL
【发布时间】:2019-08-14 13:31:03
【问题描述】:

例如,如果我有以下控制器:

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 "???";
    }
}

我在我的服务器上运行它,然后我希望索引方法返回http://my-server:8080

【问题讨论】:

  • 您想要返回运行应用程序的主机的主机名和端口,还是想要返回您的 API 如何访问的基本 URL(例如,在代理之后)?
  • @saw303 后者会更好,但现在前者已经足够了。

标签: java web-services micronaut


【解决方案1】:

Asof Micronaut V1.2.0,可以使用HttpHostResolver interface,例如:

import io.micronaut.http.*;
import io.micronaut.http.annotation.*;
import io.micronaut.http.server.util.HttpHostResolver;
import io.micronaut.web.router.RouteBuilder;

@Controller("/test")
public class TestController {
    private final HttpHostResolver httpHostResolver;
    private final RouteBuilder.UriNamingStrategy uriNamingStrategy;

    public TestController(
            HttpHostResolver httpHostResolver,
            RouteBuilder.UriNamingStrategy uriNamingStrategy
    ) {
        this.httpHostResolver = httpHostResolver;
        this.uriNamingStrategy = uriNamingStrategy;
    }

    @Get()
    @Produces(MediaType.TEXT_PLAIN)
    public String index(HttpRequest httpRequest) {
        return httpHostResolver.resolve(httpRequest) +
                uriNamingStrategy.resolveUri(TestController.class);
    }
}

【讨论】:

    【解决方案2】:

    这似乎有效:

    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;
        }
    }
    

    我不确定它是否是惯用的,或者它是否适用于所有情况。如果有人发布更好的答案,我会接受。

    【讨论】:

    • 你知道哪个处理程序负责你的注解@Controller 给定的路径。这个找到了,我想你也许可以找到整个 url 是如何构造的?
    • 您可以通过调用embeddedServer.getURL() 而不是调用getHost()getPort() 等并自己拼凑来消除其中的一部分。
    • 谢谢。刚刚在 1.2.0 中发现HttpHostResolver,这似乎是一种更惯用的做法。
    【解决方案3】:

    如果您希望控制器响应 /,请使用 @Controller("/") 而不是 @Controller("/test")

    【讨论】:

    • 不确定这与我的问题有何关系。
    • 您说“那么我希望 index 方法返回 my-server:8080”,我认为这意味着您希望在向 http://my-server:8080 发送请求时执行 index 方法。
    • 我现在明白了。我明白这个问题。一开始我误会了。我为噪音道歉。
    【解决方案4】:
    package com.tech.api;
    
    import io.micronaut.http.MediaType;
    import io.micronaut.http.annotation.Controller;
    import io.micronaut.http.annotation.Get;
    import io.micronaut.http.annotation.PathVariable;
    import java.util.List;
    import javax.inject.Inject;
    
    @Controller("/")
    public class ModelDefinitionsApi {
    
        @Get(uri="/modelName", produces = MediaType.APPLICATION_JSON)
        public String getModel(@PathVariable String modelName) {
            return "modelName";
        }
    }
    

    http://my-server:8080 => 主控制器网址

    http://my-server:8080/modelName => 用于 getModel 方法

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-09
      • 2013-11-20
      • 1970-01-01
      • 1970-01-01
      • 2019-10-24
      • 1970-01-01
      相关资源
      最近更新 更多