# huaweicloud-sdk-cpp-v3 **Repository Path**: HuaweiCloudDeveloper/huaweicloud-sdk-cpp-v3 ## Basic Information - **Project Name**: huaweicloud-sdk-cpp-v3 - **Description**: 华为云全新设计的SDK V3版本,提供统一的SDK使用方式。通过添加依赖或下载的方式调用华为云API,访问华为云应用、资源和数据。无需关心请求细节即可快速使用弹性云服务器(ECS)、虚拟私有云(VPC)等多个华为云服务。 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master-dev - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2023-06-13 - **Last Updated**: 2025-06-26 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README [English](./README.md) | 简体中文

华为云开发者 C++ 软件开发工具包(C++ SDK)

欢迎使用华为云 C++ SDK。 华为云 C++ SDK 让您无需关心请求细节即可快速使用弹性云服务器(ECS)、虚拟私有云(VPC)等多个华为云服务。 这里将向您介绍如何获取并使用华为云 C++ SDK 。 ## 使用前提 - 要使用华为云 C++ SDK ,您需要拥有云账号以及该账号对应的 Access Key(AK)和 Secret Access Key(SK)。 请在华为云控制台“我的凭证-访问密钥”页面上创建和查看您的 AK&SK 。更多信息请查看 [访问密钥](https://support.huaweicloud.com/usermanual-ca/zh-cn_topic_0046606340.html) 。 - 要使用华为云 C++ SDK 访问指定服务的 API ,您需要确认已在 [华为云控制台](https://console.huaweicloud.com/console/?locale=zh-cn®ion=cn-north-4#/home) 开通当前服务。 - 华为云 C++ SDK 支持 **C++ 14** 及以上版本,要求安装 **CMake 3.10** 及以上版本。 ## SDK 获取和安装 您可以通过 [SDK中心](https://console.huaweicloud.com/apiexplorer/#/sdkcenter?language=C%2B%2B) 或 [Github Releases](https://github.com/huaweicloud/huaweicloud-sdk-cpp-v3/releases?page=1) 查询SDK版本信息。 ### 依赖的第三方库 `curl`、`boost`、`cpprestsdk`、`spdlog`、`openssl` ### 在 Linux 系统上安装 SDK #### Step 1:获取依赖包 所需的这些第三方软件包在大部分系统的包管理工具中都有提供: 例如基于 Debian/Ubuntu 的系统 ``` bash sudo apt-get install libcurl4-openssl-dev libboost-all-dev libssl-dev libcpprest-dev ``` spdlog 需要从源码进行安装 ``` bash git clone https://github.com/gabime/spdlog.git cd spdlog mkdir build cd build cmake -DCMAKE_POSITION_INDEPENDENT_CODE=ON .. // 用以生成动态库 make sudo make install ``` 对于使用bson编码的服务(kvs),需要安装libbson,编译sdk时设置LIBBSON_DIR指定libbson根目录 ``` bash sudo apt-get install libbson-1.0 ``` #### Step 2:编译安装 ``` bash git clone https://github.com/huaweicloud/huaweicloud-sdk-cpp-v3.git cd huaweicloud-sdk-cpp-v3 mkdir build cd build cmake .. make sudo make install ``` 完成上述操作后,**C++ SDK 安装目录为 `/usr/local`**。 ### 在 Windows 系统上安装 SDK #### Step 1:安装 vcpkg 并使用 vcpkg 安装所需软件包 ``` bash vcpkg install curl cpprestsdk boost openssl spdlog ``` 对于使用bson编码的服务(kvs),需要安装libbson,编译sdk时设置LIBBSON_INCLUDE_DIRS和LIBBSON_LIBRARY_DIRS指定头文件和库文件路径 ``` bash vcpkg install libbson ``` #### Step 2:使用 CLion 进行编译 1. 使用 CLion 打开 `huaweicloud-sdk-cpp-v3` 目录 2. 选择 `File` → `Settings` 3. 选择 `Build, Execution, Deployment` → `CMake` 4. 在 `CMake options` 中加入 `-DCMAKE_TOOLCHAIN_FILE={your vcpkg install dir}/scripts/buildsystems/vcpkg.cmake` 5. 右键 `CMakeLists.txt` 选择 `Load CMake Project` 6. 配置clion的编译工具链为MSVC: 在第3步的`CMake`配置页面选择Toolchain为Visual Studio,不能选择mingw等其他编译器(windows平台下依赖msvc 编译器, 选择mingw等其他编译器编译会报错)。另外,用户还可以选择编译出来的二进制文件是Debug模式还是Release 模式, 选择 `Build Type`进行下拉选择即可。 7. 配置目标文件的架构和平台: windows平台支持编译不同CPU架构(x64, x86)的sdk链接库文件,用户可以根据实际需要进行配置,点击 `Build, Execution, Deployment` → `Toolchains`, 在Architecture 选项可以下拉选择支持的CPU架构。 8. 选择`Build`开始编译,编译结果会在clion控制台进行打印。 #### Step 3:安装 C++ SDK 编译完成后选择 `Build` → `Install` 完成上述操作后,**C++ SDK 安装目录为 `C:\Program File (x86)\huaweicloud-sdk-cpp-v3`** 。 ## 代码示例 - 使用如下代码同步查询指定 Region 下的 VPC 列表,实际使用中请将 `VpcClient` 替换为您使用的产品/服务相应的 `{Service}Client`。 - 认证用的ak和sk硬编码到代码中或者明文存储都有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全。 - 本示例中的ak和sk保存在环境变量中,运行本示例前请先配置环境变量`HUAWEICLOUD_SDK_AK`和`HUAWEICLOUD_SDK_SK`。 ``` cpp #include #include #include #include #include using namespace HuaweiCloud::Sdk; using namespace HuaweiCloud::Sdk::Core; using namespace HuaweiCloud::Sdk::Core::Exception; int main(void) { std::string ak; std::string sk; #if defined(WIN32) || defined(__WIN32__) || defined(_WIN32) || defined(_MSC_VER) ak = getenv("HUAWEICLOUD_SDK_AK"); sk = getenv("HUAWEICLOUD_SDK_SK"); #elif defined(linux) || defined(__linux) || defined(__linux__) char* envVar; #define INIT_ENV_VAR(ID, NAME) \ do { \ if (envVar = secure_getenv(#NAME)) { \ ID = std::string(envVar); \ } \ } while (0) INIT_ENV_VAR(ak, HUAWEICLOUD_SDK_AK); INIT_ENV_VAR(sk, HUAWEICLOUD_SDK_SK); #undef INIT_ENV_VAR #endif // Initialize AK/SK module auto basicCredentials = std::make_unique(); basicCredentials->withAk(ak) .withSk(sk) .withProjectId("{your project id}"); // Initialize HTTP config HttpConfig httpConfig = HttpConfig(); // Configure VpcClient instance std::unique_ptr vpcApi_v2 = Vpc::V2::VpcClient::newBuilder() .withCredentials(std::unique_ptr(basicCredentials.release())) .withHttpConfig(httpConfig) .withEndPoint("{your endpoint}") .build(); // Initialize request parameters Vpc::V2::Model::ListVpcsRequest listRequest; try { std::string stringValue; // Creat an API request and get response std::cout << "************ListVpc***********" << std::endl; std::shared_ptr listRes = vpcApi->listVpcs(listRequest); stringValue = listRes->getHttpBody(); std::cout << stringValue << std::endl; } catch (HostUnreachableException& e) { // handle exception std::cout << e.what() << std::endl; } catch (SslHandShakeException& e) { std::cout << e.what() << std::endl; } catch (RetryOutageException& e) { std::cout << e.what() << std::endl; } catch (CallTimeoutException& e) { std::cout << e.what() << std::endl; } catch (ServiceResponseException& e) { std::cout << "StatusCode: " << e.getStatusCode() << std::endl; std::cout << "ErrorCode: " << e.getErrorCode() << std::endl; std::cout << "ErrorMsg: " << e.getErrorMsg() << std::endl; std::cout << "RequestId: " << e.getRequestId() << std::endl; } return 0; } ``` 如果您是在 Linux 系统中运行该代码,请复制上述文件到 vpc_test.cpp。然后执行如下命令: ``` bash $ g++ -o vpc_test vpc_test.cpp --std=c++14 -lvpc_v2 -lcore -lcrypto -lboost_system -lcpprest $ ./vpc_test # 下方会显示实际运行结果 $ ``` 如果您是在 Windows系统下使用cmake来管理工程,则需要在CMakeLists.txt 中引入sdk core包和服务包的相关依赖。 可以参考下面的CMakeLists.txt 文件: ``` cmake_minimum_required(VERSION 3.16) project(demo) find_package(CURL REQUIRED) set(CMAKE_CXX_STANDARD 14) set(LINK_DIR "C:/Program Files (x86)/huaweicloud_cpp_sdk_v3/bin;") set(BIN_DIR "C:/Program Files (x86)/huaweicloud_cpp_sdk_v3/lib;") set(SERVICE_DIR "C:/Program Files (x86)/huaweicloud_cpp_sdk_v3/include;") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DBOOST_UUID_FORCE_AUTO_LINK") link_directories(${BIN_DIR}) include_directories(${SERVICE_DIR}) add_compile_options("$<$:/utf-8>") add_compile_options("$<$:/utf-8>") add_executable(demo main.cpp) target_link_libraries(demo PUBLIC core vpc_v2) ``` ## 在线调试 [API Explorer](https://apiexplorer.developer.huaweicloud.com/apiexplorer/overview) 提供API检索、SDK示例及平台调试,支持全量快速检索、可视化调试、帮助文档查看、在线咨询。 ## 变更日志 每个版本的详细更改记录可在 [变更日志](https://github.com/huaweicloud/huaweicloud-sdk-cpp-v3/blob/master/CHANGELOG_CN.md) 中查看。 ## 用户手册 [:top:](#华为云开发者-c-软件开发工具包c-sdk) * [1. 客户端连接参数](#1-客户端连接参数-top) * [1.1 默认配置](#11-默认配置-top) * [1.2 网络代理](#12-网络代理-top) * [1.3 超时配置](#13-超时配置-top) * [1.4 SSL 配置](#14-ssl-配置-top) * [2. 认证信息配置](#2-认证信息配置-top) * [2.1 使用永久 AK 和 SK](#21-使用永久-ak-和-sk-top) * [2.2 使用临时 AK 和 SK](#22-使用临时-ak-和-sk-top) * [3. 客户端初始化](#3-客户端初始化-top) * [3.1 指定云服务 Endpoint 方式](#31-指定云服务-endpoint-方式-top) * [4. 发送请求并查看响应](#4-发送请求并查看响应-top) * [4.1 异常处理](#41-异常处理-top) * [5. 异步客户端使用](#5-异步客户端使用-top) * [6. 故障处理](#6-故障处理-top) * [6.1 访问日志](#61-访问日志-top) * [7. 配置 CMakeLists.txt](#7-配置-cmakeliststxt-top) ### 1. 客户端连接参数 [:top:](#用户手册-top) #### 1.1 默认配置 [:top:](#用户手册-top) ``` cpp // 使用默认配置 HttpConfig httpConfig = HttpConfig(); ``` #### 1.2 网络代理 [:top:](#用户手册-top) ``` cpp // 根据需要配置网络代理 httpConfig.setProxyProtocol("http"); httpConfig.setProxyHost("proxy"); httpConfig.setProxyPort("8080"); // 本示例中的账号和密码保存在环境变量中,运行本示例前请先在本地环境中配置环境变量PROXY_USERNAME和PROXY_PASSWORD httpConfig.setProxyUser(getenv("USENAME")); httpConfig.setProxyPassword(getenv("PASSWORD")); ``` #### 1.3 超时配置 [:top:](#用户手册-top) ``` cpp // 默认连接超时为60秒,默认读取超时为120秒。可根据需求修改该默认值 httpConfig.setConnectTimeout(60); httpConfig.setReadTimeout(120); ``` #### 1.4 SSL 配置 [:top:](#用户手册-top) ``` cpp // 配置跳过服务端证书验证(可选) httpConfig.setIgnoreSslVerification(true); ``` ### 2. 认证信息配置 [:top:](#用户手册-top) 华为云服务存在两种部署方式,Region 级服务和 Global 级服务。 Global 级服务当前仅支持 IAM 。 Region 级服务需要提供 projectId 。 Global 级服务需要提供 domainId 。 客户端认证可以使用永久 AK&SK 认证,也可以使用临时 AK&SK&SecurityToken 认证。 **认证参数说明**: - `ak` 华为云账号 Access Key - `sk` 华为云账号 Secret Access Key - `projectId` 云服务所在项目 ID ,根据你想操作的项目所属区域选择对应的项目 ID - `domainId` 华为云账号 ID - `securityToken` 采用临时 AK&SK 认证场景下的安全票据 #### 2.1 使用永久 AK 和 SK [:top:](#用户手册-top) ``` cpp // Region级服务 auto basicCredentials = std::make_unique(); basicCredentials->withAk(ak) .withSk(sk) .withProjectId(projectId); // Global级服务 auto globalCredentials = std::make_unique(); globalCredentials->withAk(ak) .withSk(sk) .withDomainId(domainId); ``` **说明**: * `3.0.16-beta` 及以上版本支持自动获取 projectId/domainId ,用户需要指定当前华为云账号的永久 AK&SK 和 对应的 region_id,同时在初始化客户端时配合 `withRegion()` 方法使用。 代码示例详见 [3.2 指定Region方式(推荐)](#32-指定-region-方式-推荐-top) 。 #### 2.2 使用临时 AK 和 SK [:top:](#用户手册-top) 首先需要获得临时 AK、SK 和 SecurityToken ,可以从永久 AK&SK 获得,或者通过委托授权获得。 - 通过永久 AK&SK 获得可以参考文档:https://support.huaweicloud.com/api-iam/iam_04_0002.html ,对应 IAM SDK 中的 `CreateTemporaryAccessKeyByToken` 方法。 - 通过委托授权获得可以参考文档:https://support.huaweicloud.com/api-iam/iam_04_0101.html ,对应 IAM SDK 中的 `CreateTemporaryAccessKeyByAgency` 方法。 临时 AK&SK&SecurityToken 获取成功后,可使用如下方式初始化认证信息: ``` cpp // Region级服务 auto basicCredentials = std::make_unique(); basicCredentials->withAk(ak) .withSk(sk) .withProjectId(projectId) .withSecurityToken(securityToken); // Global级服务 auto globalCredentials = std::make_unique(); globalCredentials->withAk(ak) .withSk(sk) .withDomainId(domainId) .withSecurityToken(securityToken); ``` ### 3. 客户端初始化 [:top:](#用户手册-top) #### 3.1 指定云服务 Endpoint 方式 [:top:](#用户手册-top) ``` cpp // 初始化指定云服务的客户端 {Service}Client ,以初始化 VpcClient 为例 std::unique_ptr vpcApi_v2 = Vpc::V2::VpcClient::newBuilder() .withCredentials(basicCredentials) .withHttpConfig(httpConfig) .withEndPoint(endpoint) .build(); ``` **说明:** - `endpoint` 是华为云各服务应用区域和各服务的终端节点,详情请查看 [地区和终端节点](https://developer.huaweicloud.com/endpoint) 。 - 当用户使用指定 Region 方式无法自动获取 projectId 时,可以使用当前方式调用接口。 #### 3.2 指定Region 方式(推荐) [:top:](#用户手册-top) * Region级服务 ```c++ // 添加对应服务的Region依赖 #include using namespace HuaweiCloud::Sdk::Ecs::V2; // 初始化客户端认证信息,使用当前客户端初始化方式可不填 projectId/domainId,,以初始化 BaisicCredentials 为例 auto auth = std::make_unique(); auth->withAk(ak) .withSk(sk); // 初始化指定云服务的客户端 {Service}Client ,以初始化 Region 级服务 ECS 的 IamClient 为例 auto client = EcsClient::newBuilder() .withCredentials(std::unique_ptr(auth.release())) .withHttpConfig(httpConfig) .withFileLog(R"(.\log.txt)", true) .withStreamLog(true) .withRegion(EcsRegion::valueOf("cn-east-2")) .build(); ``` * Global级服务 ```c++ // 添加对应服务的Region依赖 #include #include using namespace HuaweiCloud::Sdk::Devstar::V1; auto auth = std::make_unique(); auth->withAk(ak).withSk(sk); // 初始化指定云服务的客户端 {Service}Client ,以初始化 Global 级服务 Devstar为例 auto client = DevStarClient::newBuilder() .withCredentials(std::unique_ptr(auth.release())) .withHttpConfig(httpConfig) .withFileLog(R"(.\log.txt)", true) .withStreamLog(true) .withRegion(DevstarRegion::valueOf("cn-east-2")) .build(); ``` **说明**: * 指定 Region 方式创建客户端的场景,支持自动获取用户的 projectId 或者 domainId,初始化认证信息时可无需指定相应参数。 * **不适用**于 `多ProjectId` 的场景。 * 当前支持指定 Region 方式初始化客户端的 region_id : af-south-1, ap-southeast-1, ap-southeast-2, ap-southeast-3, cn-east-2, cn-east-3, cn-north-1, cn-north-4, cn-south-1, cn-southwest-2, ru-northwest-2。调用其他 region 可能会抛出 `Unsupported regionId` 的异常信息。 **两种方式对比:** | 初始化方式 | 优势 | 劣势 | | ------------------------ | ------------------------------------------------------------ | -------------------------------------------- | | 指定云服务 Endpoint 方式 | 只要接口已在当前环境发布就可以成功调用 | 需要用户自行查找并填写 projectId 和 endpoint | | 指定 Region 方式 | 无需指定 projectId 和 endpoint,按照要求配置即可自动获取该值并回填 | 支持的服务和 region 有限制 | ### 4. 发送请求并查看响应 [:top:](#用户手册-top) ``` cpp // 初始化请求,以调用接口 listVpcs 为例 Vpc::V2::Model::ListVpcsRequest listRequest; std::shared_ptr listRes = vpcApi->listVpcs(listRequest); std::string responseBody = listRes->getHttpBody(); std::cout << stringValue << std::endl; ``` #### 4.1 异常处理 [:top:](#用户手册-top) | 一级分类 | 一级分类说明 | 二级分类 | 二级分类说明 | | :----------------------- | :------------- | :----------------------- | :-------------------------------------- | | ConnectionException | 连接类异常 | HostUnreachableException | 网络不可达、被拒绝 | | | | SslHandShakeException | SSL认证异常 | | RequestTimeoutException | 响应超时异常 | CallTimeoutException | 单次请求,服务器处理超时未返回 | | | | RetryOutageException | 在重试策略消耗完成已后,仍无有效的响应 | | ServiceResponseException | 服务器响应异常 | ServerResponseException | 服务端内部错误,Http响应码:[500,] | | | | ClientRequestException | 请求参数不合法,Http响应码:[400, 500) | ``` cpp // 异常处理 try { std::shared_ptr listRes = vpcApi->listVpcs(listRequest); std::string responseBody = listRes->getHttpBody(); std::cout << stringValue << std::endl; } catch (HostUnreachableException& e) { std::cout << e.what() << std::endl; } catch (SslHandShakeException& e) { std::cout << e.what() << std::endl; } catch (RetryQutageException& e) { std::cout << e.what() << std::endl; } catch (CallTimeoutException& e) { std::cout << e.what() << std::endl; } catch (ServiceResponseException& e) { std::cout << "StatusCode: " << e.getStatusCode() << std::endl; std::cout << "ErrorCode: " << e.getErrorCode() << std::endl; std::cout << "ErrorMsg: " << e.getErrorMsg() << std::endl; std::cout << "RequestId: " << e.getRequestId() << std::endl; } ``` ### 5. 异步客户端使用 [:top:](#用户手册-top) ``` cpp // 采用c++ std::async接口实现,以listVpcs接口为例 #include auto future = std::async(std::launch::async, &Vpc::V2::VpcClient::listVpcs, vpcApi, listRequest); auto listResponse = future.get(); ``` ### 6. 故障处理 [:top:](#用户手册-top) SDK 提供 Access 级别的访问日志,用户可根据需要进行配置。 #### 6.1 访问日志 [:top:](#用户手册-top) SDK 支持打印 Access 级别的访问日志,需要用户手动打开日志开关,支持打印到控制台或者指定的文件。示例如下: ``` cpp // 初始化指定云服务的客户端 {Service}Client ,以初始化 VpcClient 为例 std::unique_ptr vpcApi_v2 = Vpc::V2::VpcClient::newBuilder() .withCredentials(basicCredentials) .withHttpConfig(httpConfig) .withFileLog(R"(.\log.txt)", true) .withStreamLog(true) .withEndPoint(endpoint) .build(); ``` **说明**: - `withFileLogger` 支持如下配置: - `logPath`: 日志文件路径 - `enable`: 日志文件使能 - `withStreamLogger` 支持如下配置: - `enable`: 使能控制台输出日志 打开日志开关后,每次请求都会有一条记录,如: ``` text [2020-10-16 03:10:29][INFO] "GET https://iam.cn-north-1.myhuaweicloud.com/v3.0/OS-CREDENTIAL/credentials/W8VHHFEFPIJV6TFOUOQO" 200 244 7a68399eb8ed63fc91018426a7c4b8a0 ``` 日志格式为: ``` text "{httpMethod} {uri}" {httpStatusCode} {responseContentLength} {requestId} ``` ### 7. 配置 CMakeLists.txt [:top:](#用户手册-top) - 使用一个服务 ``` cmake # USE ONE SERVICE SET(BUILD_SERVICE vpc) SET(SERVICE_VERSION v2) if(BUILD_SERVICE STREQUAL "") add_subdirectory(core) else() add_subdirectory(core) add_subdirectory(${BUILD_SERVICE}/src/${SERVICE_VERSION}) message(STATUS "'BUILD_SERVICE'=${BUILD_SERVICE}") endif() ``` - 使用多个服务 ``` cmake # USE MULTIPLE SERVICES(EXAMPLE: USE VPC ECS AND EIP) add_subdirectory(core) add_subdirectory(vpc/src/v2) add_subdirectory(eip/src/v2) add_subdirectory(ecs/src/v2) ``` - 对于使用bson编码的服务(kvs),需要设置ENABLE_BSON开关为ON,默认OFF ``` cmake # SET ENABLE_BSON IS ON option(ENABLE_BSON "Enable bson library" ON) ```