HTTP client abstraction for LangChain4j with synchronous/asynchronous execution and Server-Sent Events (SSE) streaming support
This guide covers making synchronous (blocking) HTTP requests using the LangChain4j HTTP Client.
import dev.langchain4j.http.client.*;
HttpRequest request = HttpRequest.builder()
.method(HttpMethod.GET)
.url("https://api.example.com/users")
.addHeader("Accept", "application/json")
.build();
SuccessfulHttpResponse response = client.execute(request);
System.out.println("Status: " + response.statusCode());
System.out.println("Body: " + response.body());HttpRequest request = HttpRequest.builder()
.method(HttpMethod.POST)
.url("https://api.example.com/users")
.addHeader("Content-Type", "application/json")
.addHeader("Authorization", "Bearer token123")
.body("{\"name\":\"Alice\",\"email\":\"alice@example.com\"}")
.build();
SuccessfulHttpResponse response = client.execute(request);Query parameters are automatically URL-encoded.
HttpRequest request = HttpRequest.builder()
.method(HttpMethod.GET)
.url("https://api.example.com/search")
.addQueryParam("q", "search term")
.addQueryParam("limit", "10")
.addQueryParam("offset", "0")
.build();
// URL becomes: https://api.example.com/search?q=search+term&limit=10&offset=0import java.util.Map;
Map<String, String> params = Map.of(
"category", "books",
"sort", "price",
"order", "asc"
);
HttpRequest request = HttpRequest.builder()
.method(HttpMethod.GET)
.url("https://api.example.com/products")
.addQueryParams(params)
.build();String baseUrl = "https://api.example.com/";
String userId = "123";
HttpRequest request = HttpRequest.builder()
.method(HttpMethod.GET)
.url(baseUrl, "/users/" + userId) // Handles slashes automatically
.build();
// URL will be: https://api.example.com/users/123HttpRequest request = HttpRequest.builder()
.method(HttpMethod.DELETE)
.url("https://api.example.com/users/123")
.addHeader("Authorization", "Bearer token123")
.build();
SuccessfulHttpResponse response = client.execute(request);HttpRequest request = HttpRequest.builder()
.method(HttpMethod.GET)
.url("https://api.example.com/data")
.addHeader("Accept", "application/json")
.addHeader("Authorization", "Bearer token123")
.build();import java.util.Map;
Map<String, String> headers = Map.of(
"Accept", "application/json",
"Authorization", "Bearer token123",
"X-Request-ID", "12345"
);
HttpRequest request = HttpRequest.builder()
.method(HttpMethod.GET)
.url("https://api.example.com/data")
.addHeaders(headers)
.build();import java.util.*;
Map<String, List<String>> headers = Map.of(
"Accept", List.of("application/json", "application/xml"),
"Cache-Control", List.of("no-cache", "no-store")
);
HttpRequest request = HttpRequest.builder()
.method(HttpMethod.GET)
.url("https://api.example.com/data")
.headers(headers)
.build();SuccessfulHttpResponse response = client.execute(request);
// Access status code
int status = response.statusCode();
System.out.println("Status: " + status);
// Access response body
String body = response.body();
System.out.println("Body: " + body);
// Access headers
Map<String, List<String>> headers = response.headers();
List<String> contentType = headers.get("Content-Type");
if (contentType != null && !contentType.isEmpty()) {
System.out.println("Content-Type: " + contentType.get(0));
}import com.fasterxml.jackson.databind.ObjectMapper;
HttpRequest request = HttpRequest.builder()
.method(HttpMethod.GET)
.url("https://api.example.com/users/123")
.addHeader("Accept", "application/json")
.build();
SuccessfulHttpResponse response = client.execute(request);
// Parse JSON response body
ObjectMapper mapper = new ObjectMapper();
User user = mapper.readValue(response.body(), User.class);
System.out.println("User name: " + user.getName());SuccessfulHttpResponse response = client.execute(request);
if (response.statusCode() == 200) {
System.out.println("OK: " + response.body());
} else if (response.statusCode() == 201) {
System.out.println("Created: " + response.body());
} else if (response.statusCode() == 204) {
System.out.println("No Content");
}String body = response.body();
if (body != null) {
System.out.println("Response body: " + body);
} else {
System.out.println("Response has no body (e.g., 204 No Content)");
}See the Error Handling Guide for complete error handling patterns.
import dev.langchain4j.exception.HttpException;
try {
SuccessfulHttpResponse response = client.execute(request);
System.out.println("Success: " + response.body());
} catch (HttpException e) {
// Handle 4XX/5XX errors
System.err.println("HTTP error: " + e.getMessage());
} catch (RuntimeException e) {
// Handle network errors, timeouts
System.err.println("Request failed: " + e.getMessage());
}public class ApiClient {
private final HttpClient client;
private final String baseUrl;
private final String apiKey;
public ApiClient(HttpClient client, String baseUrl, String apiKey) {
this.client = client;
this.baseUrl = baseUrl;
this.apiKey = apiKey;
}
public SuccessfulHttpResponse get(String path) {
HttpRequest request = HttpRequest.builder()
.method(HttpMethod.GET)
.url(baseUrl, path)
.addHeader("Authorization", "Bearer " + apiKey)
.addHeader("Accept", "application/json")
.build();
return client.execute(request);
}
public SuccessfulHttpResponse post(String path, String jsonBody) {
HttpRequest request = HttpRequest.builder()
.method(HttpMethod.POST)
.url(baseUrl, path)
.addHeader("Authorization", "Bearer " + apiKey)
.addHeader("Content-Type", "application/json")
.body(jsonBody)
.build();
return client.execute(request);
}
}public HttpRequest.Builder createBaseRequest(String url) {
return HttpRequest.builder()
.url(url)
.addHeader("User-Agent", "MyApp/1.0")
.addHeader("Accept", "application/json");
}
// Use the template
HttpRequest request = createBaseRequest("https://api.example.com/data")
.method(HttpMethod.GET)
.addHeader("Authorization", "Bearer token")
.build();Install with Tessl CLI
npx tessl i tessl/maven-dev-langchain4j--langchain4j-http-client@1.11.0