1

我有一个使用以下配置运行的 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);

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

4

1 回答 1

1

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

你不需要它。通过构造函数注入你的类就足够了HttpClient

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

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


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

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

@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

于 2021-06-13T06:19:08.057 回答