ether-http-client provee un cliente HTTP tipado sobre java.net.http.HttpClient (Java 21+) con DSL fluente, deserialización JSON integrada y soporte para todos los verbos HTTP.
Instalación
<dependency>
<groupId>dev.rafex.ether.http.client</groupId>
<artifactId>ether-http-client</artifactId>
<version>8.0.0-SNAPSHOT</version>
</dependency>
Crear el cliente
EtherHttpClient client = new DefaultEtherHttpClient(config);
HttpClient httpClient = HttpClient.newBuilder()
.connectTimeout(Duration.ofSeconds(10))
.followRedirects(HttpClient.Redirect.NORMAL)
.build();
EtherHttpClient client = new DefaultEtherHttpClient(httpClient, codec);
GET
HttpResponseSpec response = client.get(URI.create("https://api.example.com/users"));
int status = response.status();
String body = response.bodyAsString();
byte[] bytes = response.body();
List<User> users = client.sendJson(
HttpRequestSpec.get(URI.create("https://api.example.com/users")).build(),
new TypeReference<List<User>>() {}
);
POST con JSON
CreateUserRequest req = new CreateUserRequest("Alice", "alice@example.com");
HttpResponseSpec response = client.send(
HttpRequestSpec.post(URI.create("https://api.example.com/users"))
.jsonBody(req)
.header("Authorization", "Bearer " + token)
.timeout(Duration.ofSeconds(30))
.build()
);
if (response.status() == 201) {
User created = response.bodyAsJson(User.class);
}
PUT, PATCH, DELETE
client.send(
HttpRequestSpec.put(URI.create("https://api.example.com/users/42"))
.jsonBody(updateRequest)
.build()
);
client.send(
HttpRequestSpec.patch(URI.create("https://api.example.com/users/42"))
.jsonBody(patchRequest)
.build()
);
HttpResponseSpec del = client.send(
HttpRequestSpec.delete(URI.create("https://api.example.com/users/42"))
.header("Authorization", "Bearer " + token)
.build()
);
assert del.status() == 204;
Cabeceras de respuesta
HttpResponseSpec response = client.get(URI.create("https://api.example.com/users"));
Map<String, List<String>> headers = response.headers();
String contentType = response.headers().get("content-type").get(0);
String requestId = response.headers().getOrDefault("x-request-id", List.of("")).get(0);
HttpMethod enum
HttpMethod.GET
HttpMethod.POST
HttpMethod.PUT
HttpMethod.PATCH
HttpMethod.DELETE
HttpMethod.HEAD
HttpMethod.OPTIONS
Integración con ether-di
public class AppContainer implements AutoCloseable {
private final Closer closer = new Closer();
private final Lazy<EtherHttpClient> httpClient = new Lazy<>(() ->
closer.register(new DefaultEtherHttpClient(
HttpClientConfig.defaults(), codec.get())));
public EtherHttpClient httpClient() { return httpClient.get(); }
@Override public void close() { closer.close(); }
}
Más información