Eclipse Jetty HTTP Client - A lightweight, asynchronous HTTP client library that supports HTTP/1.1, HTTP/2, WebSocket, and various authentication mechanisms, proxy configurations, and connection pooling strategies.
—
The Request interface provides a fluent API for configuring HTTP requests with comprehensive customization options including headers, timeouts, content, cookies, and HTTP methods.
The core interface for configuring and sending HTTP requests.
public interface Request {
// Connection information
Connection getConnection();
// URI components
String getScheme();
Request scheme(String scheme);
String getHost();
Request host(String host);
int getPort();
Request port(int port);
String getPath();
Request path(String path);
String getQuery();
Request query(String query);
URI getURI();
// HTTP method and version
HttpMethod getMethod();
Request method(HttpMethod method);
Request method(String method);
HttpVersion getVersion();
Request version(HttpVersion version);
// Headers and cookies
HttpFields getHeaders();
Request headers(Consumer<HttpFields> headers);
Request header(String name, String value);
Request headers(HttpFields headers);
List<HttpCookie> getCookies();
Request cookie(HttpCookie cookie);
// Timeout configuration
Request timeout(long timeout, TimeUnit unit);
long getTimeout();
// Content
Request body(Request.Content content);
Request file(Path file) throws IOException;
Request file(Path file, String contentType) throws IOException;
// Sending
ContentResponse send() throws InterruptedException, ExecutionException, TimeoutException;
void send(Response.CompleteListener listener);
// Listener management
Request onRequestQueued(Request.QueuedListener listener);
Request onRequestBegin(Request.BeginListener listener);
Request onRequestHeaders(Request.HeadersListener listener);
Request onRequestCommit(Request.CommitListener listener);
Request onRequestContent(Request.ContentListener listener);
Request onRequestSuccess(Request.SuccessListener listener);
Request onRequestFailure(Request.FailureListener listener);
Request onResponseBegin(Response.BeginListener listener);
Request onResponseHeader(Response.HeaderListener listener);
Request onResponseHeaders(Response.HeadersListener listener);
Request onResponseContent(Response.ContentListener listener);
Request onResponseContentDemanded(Response.DemandedContentListener listener);
Request onResponseSuccess(Response.SuccessListener listener);
Request onResponseFailure(Response.FailureListener listener);
}Configure the target URI components of the request.
Request request = client.newRequest("https://api.example.com")
.path("/users/123")
.query("format=json&include=profile");Request request = client.newRequest("localhost", 8080)
.scheme("https")
.path("/api/v1/data")
.query("limit=10&offset=0");// Using Fields for structured query parameters
Fields queryFields = new Fields();
queryFields.add("category", "books");
queryFields.add("sort", "title");
queryFields.add("order", "asc");
String queryString = queryFields.toQueryString();
Request request = client.newRequest("https://api.example.com/search")
.query(queryString);Configure the HTTP method for the request.
Request request = client.newRequest("https://api.example.com/users/123")
.method(HttpMethod.PUT);Request request = client.newRequest("https://api.example.com/data")
.method("PATCH");// GET (default for newRequest)
Request getRequest = client.newRequest("https://api.example.com/users");
// POST (also available via client.POST())
Request postRequest = client.newRequest("https://api.example.com/users")
.method(HttpMethod.POST);
// PUT
Request putRequest = client.newRequest("https://api.example.com/users/123")
.method(HttpMethod.PUT);
// DELETE
Request deleteRequest = client.newRequest("https://api.example.com/users/123")
.method(HttpMethod.DELETE);
// PATCH
Request patchRequest = client.newRequest("https://api.example.com/users/123")
.method(HttpMethod.PATCH);Configure HTTP headers for the request.
Request request = client.newRequest("https://api.example.com/data")
.header("Authorization", "Bearer " + token)
.header("Content-Type", "application/json")
.header("Accept", "application/json")
.header("User-Agent", "MyApp/1.0");Request request = client.newRequest("https://api.example.com/data")
.headers(headers -> {
headers.add("Authorization", "Bearer " + token);
headers.add("Content-Type", "application/json");
headers.add("Accept", "application/json");
headers.add("X-Custom-Header", "custom-value");
});HttpFields headers = HttpFields.build()
.add("Authorization", "Bearer " + token)
.add("Content-Type", "application/json")
.add("Accept", "application/json");
Request request = client.newRequest("https://api.example.com/data")
.headers(headers);Configure cookies for the request.
HttpCookie sessionCookie = HttpCookie.build("JSESSIONID", "ABC123")
.path("/")
.secure(true)
.build();
HttpCookie userCookie = HttpCookie.build("userId", "12345")
.path("/")
.build();
Request request = client.newRequest("https://api.example.com/data")
.cookie(sessionCookie)
.cookie(userCookie);HttpCookie cookie = HttpCookie.build("preferences", "theme=dark;lang=en")
.domain(".example.com")
.path("/")
.maxAge(Duration.ofDays(30))
.secure(true)
.httpOnly(true)
.sameSite(HttpCookie.SameSite.STRICT)
.build();
Request request = client.newRequest("https://api.example.com/user/profile")
.cookie(cookie);Configure request timeout settings.
// Timeout in milliseconds
Request request = client.newRequest("https://api.example.com/data")
.timeout(5000, TimeUnit.MILLISECONDS);
// Timeout in seconds
Request request = client.newRequest("https://api.example.com/data")
.timeout(30, TimeUnit.SECONDS);
// Timeout in minutes
Request request = client.newRequest("https://api.example.com/long-running")
.timeout(5, TimeUnit.MINUTES);Request request = client.newRequest("https://api.example.com/data")
.timeout(0, TimeUnit.MILLISECONDS); // No timeoutConfigure the HTTP protocol version.
// HTTP/1.1 (default)
Request request = client.newRequest("https://api.example.com/data")
.version(HttpVersion.HTTP_1_1);
// HTTP/2
Request request = client.newRequest("https://api.example.com/data")
.version(HttpVersion.HTTP_2);
// HTTP/1.0
Request request = client.newRequest("https://api.example.com/data")
.version(HttpVersion.HTTP_1_0);Configure request body content. See Content Management for detailed content options.
Request request = client.newRequest("https://api.example.com/users")
.method(HttpMethod.POST)
.content(new StringRequestContent("application/json", jsonData));Path file = Paths.get("/path/to/file.json");
Request request = client.newRequest("https://api.example.com/upload")
.method(HttpMethod.POST)
.file(file);Configure listeners to monitor request lifecycle events.
Request request = client.newRequest("https://api.example.com/data")
.onRequestQueued(req -> System.out.println("Request queued"))
.onRequestBegin(req -> System.out.println("Request begun"))
.onRequestHeaders(req -> System.out.println("Request headers sent"))
.onRequestSuccess(req -> System.out.println("Request succeeded"))
.onRequestFailure((req, failure) -> System.err.println("Request failed: " + failure));Request request = client.newRequest("https://api.example.com/data")
.onResponseBegin(resp -> System.out.println("Response begun"))
.onResponseHeaders(resp -> System.out.println("Response headers received"))
.onResponseContent((resp, content) -> {
System.out.println("Received " + content.remaining() + " bytes");
})
.onResponseSuccess(resp -> System.out.println("Response succeeded"))
.onResponseFailure((resp, failure) -> System.err.println("Response failed: " + failure));String jsonPayload = "{\"name\":\"John Doe\",\"email\":\"john@example.com\"}";
ContentResponse response = client.newRequest("https://api.example.com/users")
.method(HttpMethod.POST)
.header("Authorization", "Bearer " + authToken)
.header("Content-Type", "application/json")
.header("Accept", "application/json")
.header("User-Agent", "MyApp/1.2.3")
.timeout(10, TimeUnit.SECONDS)
.content(new StringRequestContent(jsonPayload))
.send();Path uploadFile = Paths.get("/path/to/document.pdf");
ContentResponse response = client.newRequest("https://api.example.com/upload")
.method(HttpMethod.POST)
.header("Authorization", "Bearer " + authToken)
.header("Content-Type", "application/pdf")
.header("X-File-Name", uploadFile.getFileName().toString())
.header("X-File-Size", String.valueOf(Files.size(uploadFile)))
.timeout(5, TimeUnit.MINUTES)
.file(uploadFile)
.send();Request request = client.newRequest("https://api.example.com/sensitive-data")
.header("Authorization", "Bearer " + authToken)
.onRequestBegin(req -> {
// Validate authorization before sending
if (!isValidToken(authToken)) {
throw new IllegalStateException("Invalid authorization token");
}
})
.onResponseHeaders(resp -> {
// Validate response headers
String contentType = resp.getHeaders().get("Content-Type");
if (!"application/json".equals(contentType)) {
throw new IllegalStateException("Unexpected content type: " + contentType);
}
});
ContentResponse response = request.send();Install with Tessl CLI
npx tessl i tessl/maven-org-eclipse-jetty--jetty-client