
# Java

Start with the [REST guide](../rest.md) to get a Platform API token. This example uses Java's `HttpClient` and Jackson to parse JSON.

Create a Gradle project. Add this `build.gradle`:

```groovy
plugins {
    id 'java'
    id 'application'
}

repositories { mavenCentral() }
dependencies {
    implementation 'com.fasterxml.jackson.core:jackson-databind:2.19.0'
}
application { mainClass = 'dev.reconstruct.example.Main' }
```

Save as `src/main/java/dev/reconstruct/example/Main.java`:

```java
package dev.reconstruct.example;

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.net.URI;
import java.net.URLEncoder;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.nio.charset.StandardCharsets;
import java.time.Duration;

public final class Main {
    private static final String BASE = "https://reconstruct.dev/api/v1/platform";

    private static JsonNode get(HttpClient client, ObjectMapper mapper,
                                String token, String path) throws Exception {
        var request = HttpRequest.newBuilder(URI.create(BASE + path))
            .header("Authorization", "Bearer " + token)
            .timeout(Duration.ofSeconds(10))
            .GET().build();
        var response = client.send(request, HttpResponse.BodyHandlers.ofString());
        if (response.statusCode() != 200) {
            throw new IllegalStateException("API returned HTTP " + response.statusCode());
        }
        return mapper.readTree(response.body());
    }

    public static void main(String[] args) throws Exception {
        String token = System.getenv("CR_RECONSTRUCT_API_TOKEN");
        if (token == null || token.isBlank()) {
            throw new IllegalStateException("Set CR_RECONSTRUCT_API_TOKEN");
        }
        var client = HttpClient.newHttpClient();
        var mapper = new ObjectMapper();
        var page = get(client, mapper, token, "/catalogs?pageSize=10");
        for (var catalog : page.path("catalogs")) {
            String id = catalog.path("catalogId").asText();
            String encoded = URLEncoder.encode(id, StandardCharsets.UTF_8)
                .replace("+", "%20");
            var detail = get(client, mapper, token, "/catalogs/" + encoded);
            System.out.println(detail.path("catalogId").asText() + ": "
                + detail.path("description").asText());
        }
        if (page.hasNonNull("nextPageToken")) {
            System.out.println("Next page token: " + page.get("nextPageToken").asText());
        }
    }
}
```

Run `gradle run` (or `./gradlew run` with a wrapper). Send `nextPageToken` as the URL-encoded `pageToken` query parameter to fetch another page.
