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
我有一个 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