CtrlK
BlogDocsLog inGet started
Tessl Logo

tessl/maven-dev-langchain4j--langchain4j-http-client

HTTP client abstraction for LangChain4j with synchronous/asynchronous execution and Server-Sent Events (SSE) streaming support

Overview
Eval results
Files

synchronous-requests.mddocs/guides/

Synchronous HTTP Requests Guide

This guide covers making synchronous (blocking) HTTP requests using the LangChain4j HTTP Client.

Basic GET Request

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());

POST Request with JSON 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);

Request with Query Parameters

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=0

Multiple Query Parameters from Map

import 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();

URL Construction

Using Base URL and Path

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/123

DELETE Request

HttpRequest request = HttpRequest.builder()
    .method(HttpMethod.DELETE)
    .url("https://api.example.com/users/123")
    .addHeader("Authorization", "Bearer token123")
    .build();

SuccessfulHttpResponse response = client.execute(request);

Working with Headers

Single Header

HttpRequest request = HttpRequest.builder()
    .method(HttpMethod.GET)
    .url("https://api.example.com/data")
    .addHeader("Accept", "application/json")
    .addHeader("Authorization", "Bearer token123")
    .build();

Multiple Headers from Map

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();

Multi-Value Headers

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();

Response Handling

Accessing Response Data

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

Parsing JSON Response

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());

Checking Specific Status Codes

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

Handling Null Response Body

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

Error Handling

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

Common Patterns

Factory Method for Requests

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

Reusable Request Template

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();

Related Documentation

Install with Tessl CLI

npx tessl i tessl/maven-dev-langchain4j--langchain4j-http-client@1.11.0

docs

index.md

installation.md

quick-start.md

tile.json