
# C++ {/* #c */}

首先阅读 [gRPC 指南](/docs/zh/api/grpc)，获取平台 API 令牌并下载 `platform.proto`。安装 `protoc`、`grpc_cpp_plugin` 以及 gRPC 和 protobuf C++ 库。安装方法参阅 [C++ 官方设置指南](https://grpc.io/docs/languages/cpp/quickstart/)。

在包含 `platform.proto` 的目录中生成 protobuf 消息和服务存根：

```bash
protoc -I. --cpp_out=. platform.proto
```

```bash
protoc -I. --grpc_out=. \
  --plugin=protoc-gen-grpc="$(command -v grpc_cpp_plugin)" platform.proto
```

保存为 `main.cc`：

```cpp
#include <cstdlib>
#include <iostream>
#include <memory>
#include <string>

#include <grpcpp/grpcpp.h>
#include "platform.grpc.pb.h"

int main() {
  const char* token = std::getenv("CR_RECONSTRUCT_API_TOKEN");
  if (!token || !*token) {
    std::cerr << "Set CR_RECONSTRUCT_API_TOKEN\n";
    return 1;
  }

  auto channel = grpc::CreateChannel(
      "reconstruct.dev:443", grpc::SslCredentials(grpc::SslCredentialsOptions{}));
  auto client = reconstruct::platform::v1::PlatformService::NewStub(channel);
  reconstruct::platform::v1::ListCatalogsRequest list_request;
  list_request.set_page_size(10);
  reconstruct::platform::v1::ListCatalogsResponse page;
  grpc::ClientContext list_context;
  list_context.AddMetadata("authorization", std::string("Bearer ") + token);

  auto status = client->ListCatalogs(&list_context, list_request, &page);
  if (!status.ok()) {
    std::cerr << status.error_message() << '\n';
    return 1;
  }

  for (const auto& catalog : page.catalogs()) {
    reconstruct::platform::v1::GetCatalogRequest get_request;
    get_request.set_catalog_id(catalog.catalog_id());
    reconstruct::platform::v1::GetCatalogResponse detail;
    grpc::ClientContext get_context;
    get_context.AddMetadata("authorization", std::string("Bearer ") + token);
    status = client->GetCatalog(&get_context, get_request, &detail);
    if (!status.ok()) {
      std::cerr << status.error_message() << '\n';
      return 1;
    }
    std::cout << detail.catalog_id() << ": " << detail.description() << '\n';
  }
}
```

使用以下 `CMakeLists.txt` 编译生成的文件和客户端：

```cmake
cmake_minimum_required(VERSION 3.16)
project(reconstruct_client LANGUAGES CXX)
set(CMAKE_CXX_STANDARD 17)

find_package(Protobuf CONFIG REQUIRED)
find_package(gRPC CONFIG REQUIRED)

add_executable(reconstruct_client
  main.cc platform.pb.cc platform.grpc.pb.cc)
target_link_libraries(reconstruct_client PRIVATE
  gRPC::grpc++ protobuf::libprotobuf)
```

运行 `cmake -S . -B build`，然后运行 `cmake --build build` 和 `./build/reconstruct_client`。
