
# C# {/* #c */}

Platform API 토큰을 만들려면 [REST 가이드](/docs/ko/api/rest)부터 시작하세요. 이 예시는 `HttpClient`와 내장 JSON API를 사용하며 생성된 gRPC 클라이언트가 필요하지 않습니다.

콘솔 프로젝트를 만드세요:

```bash
dotnet new console -n ReconstructRestExample
```

프로젝트 디렉터리로 이동하세요:

```bash
cd ReconstructRestExample
```

다음 `Program.cs`를 사용하세요:

```csharp
using System.Net.Http.Headers;
using System.Net.Http.Json;
using System.Text.Json;

var token = Environment.GetEnvironmentVariable("CR_RECONSTRUCT_API_TOKEN")
    ?? throw new InvalidOperationException("Set CR_RECONSTRUCT_API_TOKEN.");
var baseUrl = Environment.GetEnvironmentVariable("CR_RECONSTRUCT_REST_URL")
    ?? "https://reconstruct.dev/api/v1/platform";

using var client = new HttpClient { BaseAddress = new Uri(baseUrl.TrimEnd('/') + "/") };
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);

using var page = await client.GetFromJsonAsync<JsonDocument>("catalogs?pageSize=10")
    ?? throw new InvalidOperationException("The catalog response was empty.");

if (page.RootElement.TryGetProperty("catalogs", out var catalogs))
{
    foreach (var catalog in catalogs.EnumerateArray())
    {
        var id = catalog.GetProperty("catalogId").GetString()!;
        using var detail = await client.GetFromJsonAsync<JsonDocument>(
            "catalogs/" + Uri.EscapeDataString(id))
            ?? throw new InvalidOperationException("The catalog detail was empty.");
        Console.WriteLine($"{id}: {detail.RootElement.GetProperty("description").GetString()}");
    }
}
```

`dotnet run`을 실행하세요. 목록 응답에 `nextPageToken`이 있으면 URL 인코딩한 `pageToken` 쿼리 매개변수로 전달하여 계속 읽으세요.
