Micronaut java 使用现有服务器创建 httpclient

Micronaut java httpclient creation with the existing server

我有一个 Micronaut 应用程序 运行 以下配置:

micronaut:
  server:
    cors:
       enabled: true 
    port: 8080

现在我有了一个增强功能,我想调用第 3 方 URL 并在我的应用程序(我的应用程序中的一个模块)中获得响应。我使用了以下代码片段:

    EmbeddedServer server = ApplicationContext.run(EmbeddedServer.class);
    HttpClient client = server .getApplicationContext() .createBean(HttpClient.class, server.getURL());
    HttpRequest req = HttpRequest.GET(urlHost);
    HttpResponse<String> response = client.toBlocking().exchange(req, String.class);

但这不起作用。我得到端口已经在使用中。我在 google 中没有找到太多帮助,因为 Micronaut 的 HttpClient 通常用于 Micronaut 测试,而我的情况并非如此。这可以在我的应用程序中使用吗?如果是这样怎么办?提前致谢。

这是因为您正在 ApplicationContext.run(EmbeddedServer.class) 启动另一个服务器。

你不需要它。通过构造函数将 HttpClient 注入 class 就足够了:

@Singleton 
public class MyClient {

    private final RxHttpClient client;

    public MyClient(@Client("https://some.third-party.com") RxHttpClient client) {  
        this.client = client;
    }

    HttpResponse<String> getSomething(Integer id) {
        URI uri = UriBuilder.of("/some-objects").path(id).build();
        return client.toBlocking().exchange(HttpRequest.GET(uri), String.class);
    }
}

例如,如果您在 some-service.url 路径下的应用程序配置中有第三方服务器 URL,那么您可以使用 @Client("${some-service.url}")


另一种选择是为第三方服务器定义声明式客户端,然后在需要时将其注入您的 classes。

首先为您的第三方服务定义客户端接口:

@Client("some-service")
public interface SomeServiceClient {

    @Get("/api/some-objects/{id}")
    String getSomeObject(@QueryValue("id") Integer id);
}

在应用程序配置中为该服务添加客户端配置 (application.yaml):

micronaut:
  http:
    services:
      some-service:
        url: "https://some.third-party.com"
        read-timeout: 1m

然后你可以在你需要的地方注入SomeServiceClient:

@Singleton 
public class SomeServiceConsumer {

    private final SomeServiceClient client;

    public SomeServiceConsumer(SomeServiceClient client) {  
        this.client = client;
    }

    void doWithSomething(Integer id) {
        String object = client.getSomeObject(id);
        ... // processing of object here
    }
}

您可以在 Micronaut 文档中找到更多信息 https://guides.micronaut.io/latest/micronaut-http-client-gradle-java.html