Utilisez l'OSS C++ SDK V2 pour charger, télécharger et gérer des objets dans Alibaba Cloud OSS depuis vos applications C++. Conçu pour les scénarios à hautes performances, les systèmes embarqués et les applications de bureau.
L'OSS C++ SDK V2 est en version d'aperçu. Les interfaces peuvent évoluer. Consultez les notes de publication du dépôt GitHub pour suivre les mises à jour.
Démarrage rapide
Suivez les étapes ci-dessous pour installer le kit de développement logiciel (SDK), configurer les informations d'identification et initialiser un client.
Prérequis
Un compilateur C++17 ou ultérieur (GCC 7+, Clang 5+ ou MSVC 2017+).
CMake 3.15 ou ultérieur.
Exécutez la commande cmake --version pour vérifier votre version de CMake. Si CMake n'est pas installé ou si la version est antérieure à la 3.15, téléchargez et installez CMake .
Installation du SDK
L'utilisation de vcpkg est la méthode d'installation recommandée.
vcpkg
Utilisez le gestionnaire de paquets vcpkg pour installer le SDK :
vcpkg install alibabacloud-oss-cpp-sdk-v2[curl]
# On Windows, you can use WinHTTP as the HTTP transport layer instead.
vcpkg install alibabacloud-oss-cpp-sdk-v2[winhttp]
Vous pouvez également effectuer l'installation à partir du code source en utilisant un port de superposition (overlay) :
git clone https://github.com/aliyun/alibabacloud-oss-cpp-sdk-v2.git
vcpkg install alibabacloud-oss-cpp-sdk-v2[curl] --overlay-ports=alibabacloud-oss-cpp-sdk-v2/vcpkg --head
Vous devez spécifier une couche de transport HTTP (curl ou winhttp), car aucune n'est activée par défaut. Vous pouvez activer les deux.
Si openssl et mbedtls sont tous deux activés, openssl est prioritaire.
Fonctionnalités optionnelles :
|
Fonctionnalité |
Description |
|
|
Couche de transport HTTP basée sur libcurl. Vous devez spécifier explicitement |
|
|
Couche de transport HTTP basée sur WinHTTP (Windows uniquement). |
|
|
Utilise OpenSSL pour le calcul de hachage. |
|
|
Utilise mbedTLS pour le calcul de hachage. |
|
|
Active le chiffrement côté client. Sur les plateformes autres que Windows, vous devez également activer |
|
|
Active les informations de type à l'exécution (RTTI) au moment de la compilation. |
|
|
Utilise la version de tinyxml2 installée sur le système plutôt que celle incluse avec le SDK. |
Définitions complètes : vcpkg/vcpkg.json.
Code source
Téléchargez la dernière version de l'OSS C++ SDK V2 depuis GitHub, puis compilez et installez-le avec CMake :
git clone https://github.com/aliyun/alibabacloud-oss-cpp-sdk-v2.git
cd alibabacloud-oss-cpp-sdk-v2
mkdir build && cd build
cmake .. -DCMAKE_INSTALL_PREFIX=/usr/local
cmake --build . --target install
Options CMake disponibles :
|
Option |
Description |
|
|
Compile le SDK en tant que bibliothèque partagée. Par défaut, une bibliothèque statique est compilée (OFF). |
|
|
Utilise libcurl comme couche de transport HTTP. |
|
|
Utilise WinHTTP comme couche de transport HTTP (Windows uniquement). |
|
|
Utilise la version de libcurl installée sur le système plutôt que celle incluse avec le SDK. |
|
|
Utilise la version d'OpenSSL installée sur le système. |
|
|
Utilise la version de mbedTLS installée sur le système. |
|
|
Utilise la version de tinyxml2 installée sur le système. |
|
|
Utilise |
|
|
Active le chiffrement côté client. |
|
|
Active les informations de type à l'exécution (RTTI). |
Ajoutez la dépendance au fichier CMakeLists.txt de votre projet :
cmake_minimum_required(VERSION 3.15)
project(my-app)
find_package(alibabacloud_oss_v2 REQUIRED)
add_executable(MyApp main.cpp)
target_link_libraries(MyApp PRIVATE alibabacloud_oss_v2::oss)
Configuration des informations d'identification d'accès
Définissez des variables d'environnement contenant la paire AccessKey de votre utilisateur RAM.
Dans la console RAM , créez un utilisateur RAM et générez une AccessKey permanente . Enregistrez l'AccessKey, puis accordez l'autorisation AliyunOSSFullAccess à l'utilisateur.
Linux
-
Dans l'interface de ligne de commande, exécutez les commandes suivantes pour ajouter les variables d'environnement à votre fichier
~/.bashrc.echo "export OSS_ACCESS_KEY_ID='YOUR_ACCESS_KEY_ID'" >> ~/.bashrc echo "export OSS_ACCESS_KEY_SECRET='YOUR_ACCESS_KEY_SECRET'" >> ~/.bashrc-
Exécutez la commande suivante pour appliquer les modifications.
source ~/.bashrc -
Exécutez les commandes suivantes pour vérifier que les variables d'environnement sont définies.
echo $OSS_ACCESS_KEY_ID echo $OSS_ACCESS_KEY_SECRET
-
macOS
-
Dans le terminal, exécutez la commande suivante pour vérifier votre shell par défaut.
echo $SHELL-
Les étapes suivantes dépendent de votre shell par défaut.
Zsh
-
Exécutez les commandes suivantes pour ajouter les variables d'environnement à votre fichier
~/.zshrc.echo "export OSS_ACCESS_KEY_ID='YOUR_ACCESS_KEY_ID'" >> ~/.zshrc echo "export OSS_ACCESS_KEY_SECRET='YOUR_ACCESS_KEY_SECRET'" >> ~/.zshrc -
Exécutez la commande suivante pour appliquer les modifications.
source ~/.zshrc -
Exécutez les commandes suivantes pour vérifier que les variables d'environnement sont définies.
echo $OSS_ACCESS_KEY_ID echo $OSS_ACCESS_KEY_SECRET
Bash
-
Exécutez les commandes suivantes pour ajouter les variables d'environnement à votre fichier
~/.bash_profile.echo "export OSS_ACCESS_KEY_ID='YOUR_ACCESS_KEY_ID'" >> ~/.bash_profile echo "export OSS_ACCESS_KEY_SECRET='YOUR_ACCESS_KEY_SECRET'" >> ~/.bash_profile -
Exécutez la commande suivante pour appliquer les modifications.
source ~/.bash_profile -
Exécutez les commandes suivantes pour vérifier que les variables d'environnement sont définies.
echo $OSS_ACCESS_KEY_ID echo $OSS_ACCESS_KEY_SECRET
-
-
Windows
Invite de commandes
-
Dans l'invite de commandes (CMD), exécutez les commandes suivantes :
setx OSS_ACCESS_KEY_ID "YOUR_ACCESS_KEY_ID" setx OSS_ACCESS_KEY_SECRET "YOUR_ACCESS_KEY_SECRET" -
Rouvrez l'invite de commandes et exécutez les commandes suivantes pour vérifier que les variables d'environnement sont définies.
echo %OSS_ACCESS_KEY_ID% echo %OSS_ACCESS_KEY_SECRET%
PowerShell
-
Dans PowerShell, exécutez les commandes suivantes.
[System.Environment]::SetEnvironmentVariable('OSS_ACCESS_KEY_ID', 'YOUR_ACCESS_KEY_ID', [System.EnvironmentVariableTarget]::User) [System.Environment]::SetEnvironmentVariable('OSS_ACCESS_KEY_SECRET', 'YOUR_ACCESS_KEY_SECRET', [System.EnvironmentVariableTarget]::User) -
Rouvrez PowerShell et exécutez les commandes suivantes pour vérifier que les variables d'environnement sont définies.
[System.Environment]::GetEnvironmentVariable('OSS_ACCESS_KEY_ID', [System.EnvironmentVariableTarget]::User) [System.Environment]::GetEnvironmentVariable('OSS_ACCESS_KEY_SECRET', [System.EnvironmentVariableTarget]::User)
Initialisation du client
Le SDK prend en charge trois modes de requête : OSSClient (synchrone), OSSClient (asynchrone) (basé sur un pool de threads) et OSSAsyncClient (asynchrone) (async natif). Les exemples suivants utilisent ListBuckets pour illustrer chaque mode.
OSSClient (synchrone)
Utilisez le mode synchrone d'OSSClient lorsque vous devez attendre la fin d'une opération avant de poursuivre.
Avant d'exécuter l'exemple de code, remplacez<region-id>par un point de terminaison et une région réels, tels queap-southeast-1.
#include <iostream>
#include "alibabacloud/oss2/ClientConfiguration.h"
#include "alibabacloud/oss2/OSSClient.h"
#include "alibabacloud/oss2/credentials/CredentialsProvider.h"
namespace oss = alibabacloud::oss2;
int main() {
auto conf = oss::ClientConfiguration::loadDefault();
conf.region = "<region-id>";
conf.credentialsProvider = std::make_shared<oss::EnvironmentVariableCredentialsProvider>();
oss::OSSClient client(conf);
auto outcome = client.listBuckets(
oss::models::ListBucketsRequest());
if (!outcome.has_value()) {
auto& err = outcome.error();
std::cerr << "Error Code: " << err.getCode() << std::endl;
std::cerr << "Error Message: " << err.getMessage() << std::endl;
std::cerr << "Request ID: " << err.getRequestId() << std::endl;
return 1;
}
auto& result = outcome.value();
for (auto& bucket : result.getBuckets()) {
std::cout << "bucket: name:" << bucket.name
<< ", region:" << bucket.region
<< ", storageClass:" << bucket.storageClass
<< std::endl;
}
return 0;
}
OSSClient (asynchrone)
Ce mode asynchrone basé sur un pool de threads utilise toujours OSSClient. Après avoir configuré conf.executor (un pool de threads), appelez asyncCall() pour envoyer une requête synchrone au pool de threads pour une exécution simultanée. L'appel renvoie un std::future, et l'appelant attend le résultat avec get().
Siconf.executorn'est pas configuré,asyncCall()renvoie une erreurNoExecutor.
#include <future>
#include <iostream>
#include "alibabacloud/oss2/ClientConfiguration.h"
#include "alibabacloud/oss2/OSSClient.h"
#include "alibabacloud/oss2/credentials/CredentialsProvider.h"
#include "alibabacloud/oss2/utils/DefaultExecutor.h"
namespace oss = alibabacloud::oss2;
int main() {
auto conf = oss::ClientConfiguration::loadDefault();
conf.region = "<region-id>";
conf.credentialsProvider = std::make_shared<oss::EnvironmentVariableCredentialsProvider>();
// Key: Configure a thread pool to enable asyncCall() support for OSSClient.
conf.executor = std::make_shared<oss::DefaultExecutor>();
oss::OSSClient client(conf);
// Asynchronous call that returns a std::future.
auto future = client.asyncCall(oss::models::ListBucketsRequest());
// Wait for the result by using get() (future pattern).
auto outcome = future.get();
if (!outcome.has_value()) {
auto& err = outcome.error();
std::cerr << "Error Code: " << err.getCode() << std::endl;
std::cerr << "Error Message: " << err.getMessage() << std::endl;
return 1;
}
auto& result = outcome.value();
for (auto& bucket : result.getBuckets()) {
std::cout << "bucket: name:" << bucket.name
<< ", region:" << bucket.region << std::endl;
}
return 0;
}
Exemples de chargement et de téléchargement simultanés : AsyncCallOnSyncClient.cpp et AsyncCallbackOnSyncClient.cpp.
OSSAsyncClient (asynchrone)
Ce mode asynchrone natif utilise OSSAsyncClient. Chaque opération dispose d'une méthode correspondante operationNameAsync() qui reçoit le résultat via un rappel (callback), ce qui élimine le besoin de configurer un pool de threads. Ce mode est idéal pour les scénarios nécessitant un grand volume d'opérations simultanées.
Avant d'exécuter l'exemple de code, remplacez<region-id>par un point de terminaison et une région réels, tels queap-southeast-1.
#include <iostream>
#include <thread>
#include "alibabacloud/oss2/ClientConfiguration.h"
#include "alibabacloud/oss2/OSSAsyncClient.h"
#include "alibabacloud/oss2/credentials/CredentialsProvider.h"
namespace oss = alibabacloud::oss2;
int main() {
auto conf = oss::ClientConfiguration::loadDefault();
conf.region = "<region-id>";
conf.credentialsProvider = std::make_shared<oss::EnvironmentVariableCredentialsProvider>();
auto client = std::make_shared<oss::OSSAsyncClient>(conf);
client->listBucketsAsync(
oss::models::ListBucketsRequest(),
oss::ListBucketsAsyncCallback([](oss::ListBucketsOutcome outcome) {
if (!outcome.has_value()) {
auto& err = outcome.error();
std::cerr << "Error Code: " << err.getCode() << std::endl;
std::cerr << "Error Message: " << err.getMessage() << std::endl;
return;
}
auto& result = outcome.value();
for (auto& bucket : result.getBuckets()) {
std::cout << "bucket: name:" << bucket.name
<< ", region:" << bucket.region
<< ", storageClass:" << bucket.storageClass
<< std::endl;
}
}));
// Wait for the asynchronous operation to complete.
std::this_thread::sleep_for(std::chrono::seconds(5));
return 0;
}
La sortie liste tous les buckets de votre compte, toutes régions confondues.
Configuration du client
Utiliser un domaine personnalisé
Un domaine personnalisé permet la prévisualisation des fichiers depuis un navigateur et la diffusion accélérée par CDN.
Avant d'exécuter l'exemple de code, remplacez<region-id>par un ID de région réel issu de la liste des régions et endpoints , tel queap-southeast-1.
#include <iostream>
#include "alibabacloud/oss2/ClientConfiguration.h"
#include "alibabacloud/oss2/OSSClient.h"
#include "alibabacloud/oss2/credentials/CredentialsProvider.h"
namespace oss = alibabacloud::oss2;
int main() {
auto conf = oss::ClientConfiguration::loadDefault();
conf.region = "<region-id>";
conf.endpoint = "https://your-custom-domain.com";
conf.useCName = true;
conf.credentialsProvider = std::make_shared<oss::EnvironmentVariableCredentialsProvider>();
oss::OSSClient client(conf);
// Perform operations using the custom domain.
auto outcome = client.putObject(
oss::models::PutObjectRequest()
.setBucket("your-bucket")
.setKey("your-key")
.setBody(oss::RequestBody::fromString("Hello, OSS!")));
if (!outcome.has_value()) {
auto& err = outcome.error();
std::cerr << "Error: " << err.getMessage() << std::endl;
return 1;
}
std::cout << "Upload successful" << std::endl;
return 0;
}
Contrôle des délais d'expiration
Utilisez connectTimeout et readWriteTimeout pour configurer les délais d'expiration de la connexion et de lecture/écriture en millisecondes.
auto conf = oss::ClientConfiguration::loadDefault();
conf.region = "<region-id>";
conf.credentialsProvider = std::make_shared<oss::EnvironmentVariableCredentialsProvider>();
// Set the connection timeout to 10 seconds.
conf.connectTimeout = 10000;
// Set the read/write timeout to 30 seconds.
conf.readWriteTimeout = 30000;
oss::OSSClient client(conf);
Politique de nouvelle tentative
Le gestionnaire intégré StandardRetryer utilise une stratégie FullJitterBackoff avec un maximum de 3 tentatives par défaut. Utilisez retryMaxAttempts pour ajuster cette valeur.
auto conf = oss::ClientConfiguration::loadDefault();
conf.region = "<region-id>";
conf.credentialsProvider = std::make_shared<oss::EnvironmentVariableCredentialsProvider>();
// Set the maximum number of retries to 5.
conf.retryMaxAttempts = 5;
oss::OSSClient client(conf);
Exemple de stratégie de nouvelle tentative personnalisée : CustomRetryStrategy.cpp.
Protocole HTTP/HTTPS
Le protocole HTTPS est utilisé par défaut. Pour utiliser le protocole HTTP, définissez disableSsl sur true.
auto conf = oss::ClientConfiguration::loadDefault();
conf.region = "<region-id>";
conf.credentialsProvider = std::make_shared<oss::EnvironmentVariableCredentialsProvider>();
// Use the HTTP protocol.
conf.disableSsl = true;
oss::OSSClient client(conf);
Utiliser un endpoint interne
Lorsqu'il est déployé sur ECS, utilisez un endpoint interne pour éviter les coûts liés au trafic du réseau public.
auto conf = oss::ClientConfiguration::loadDefault();
conf.region = "<region-id>";
conf.credentialsProvider = std::make_shared<oss::EnvironmentVariableCredentialsProvider>();
// Use an internal endpoint.
conf.useInternalEndpoint = true;
oss::OSSClient client(conf);
Utiliser un endpoint d'accélération de transfert
Utilisez un endpoint d'accélération de transfert pour les transferts de données sur de longues distances.
auto conf = oss::ClientConfiguration::loadDefault();
conf.region = "<region-id>";
conf.credentialsProvider = std::make_shared<oss::EnvironmentVariableCredentialsProvider>();
// Use a transfer acceleration endpoint.
conf.useAccelerateEndpoint = true;
oss::OSSClient client(conf);
Utiliser un domaine personnalisé (CNAME)
Accédez à OSS en utilisant un domaine personnalisé (CNAME).
auto conf = oss::ClientConfiguration::loadDefault();
conf.region = "<region-id>";
conf.credentialsProvider = std::make_shared<oss::EnvironmentVariableCredentialsProvider>();
conf.endpoint = "https://your-custom-domain.com";
conf.useCName = true;
oss::OSSClient client(conf);
Personnaliser le transport HTTP
Le SDK utilise cURL par défaut. Remplacez-le via httpTransport. WinHTTP est également pris en charge sous Windows.
Exemples de transport personnalisé : CurlCustomConfig.cpp et WinHttpCustomConfig.cpp.
Configurer les identifiants d'accès
Le SDK prend en charge les méthodes d'identification suivantes :
Clé d'accès d'utilisateur RAM
Utilisez la clé d'accès d'un utilisateur RAM pour les applications dans un environnement sécurisé et non exposé à Internet.
Variables d'environnement (recommandé)
Récupérez les identifiants à partir des variables d'environnement OSS_ACCESS_KEY_ID et OSS_ACCESS_KEY_SECRET.
-
Définissez les variables d'environnement en utilisant la clé d'accès d'un utilisateur RAM.
Linux
-
Depuis la ligne de commande, exécutez les commandes suivantes pour ajouter les paramètres de variable d'environnement au fichier
~/.bashrc.echo "export OSS_ACCESS_KEY_ID='YOUR_ACCESS_KEY_ID'" >> ~/.bashrc echo "export OSS_ACCESS_KEY_SECRET='YOUR_ACCESS_KEY_SECRET'" >> ~/.bashrc -
Exécutez la commande suivante pour appliquer les modifications.
source ~/.bashrc -
Exécutez les commandes suivantes pour vérifier que les variables d'environnement sont définies.
echo $OSS_ACCESS_KEY_ID echo $OSS_ACCESS_KEY_SECRET
macOS
-
Dans le terminal, exécutez la commande suivante pour vérifier votre type de shell par défaut.
echo $SHELL -
Suivez les étapes en fonction de votre type de shell par défaut.
Zsh
-
Exécutez les commandes suivantes pour ajouter les paramètres de variable d'environnement au fichier
~/.zshrc.echo "export OSS_ACCESS_KEY_ID='YOUR_ACCESS_KEY_ID'" >> ~/.zshrc echo "export OSS_ACCESS_KEY_SECRET='YOUR_ACCESS_KEY_SECRET'" >> ~/.zshrc -
Exécutez la commande suivante pour appliquer les modifications.
source ~/.zshrc -
Exécutez les commandes suivantes pour vérifier que les variables d'environnement sont définies.
echo $OSS_ACCESS_KEY_ID echo $OSS_ACCESS_KEY_SECRET
Bash
-
Exécutez les commandes suivantes pour ajouter les paramètres de variable d'environnement au fichier
~/.bash_profile.echo "export OSS_ACCESS_KEY_ID='YOUR_ACCESS_KEY_ID'" >> ~/.bash_profile echo "export OSS_ACCESS_KEY_SECRET='YOUR_ACCESS_KEY_SECRET'" >> ~/.bash_profile -
Exécutez la commande suivante pour appliquer les modifications.
source ~/.bash_profile -
Exécutez les commandes suivantes pour vérifier que les variables d'environnement sont définies.
echo $OSS_ACCESS_KEY_ID echo $OSS_ACCESS_KEY_SECRET
-
Windows
CMD
-
Dans CMD, exécutez les commandes suivantes.
setx OSS_ACCESS_KEY_ID "YOUR_ACCESS_KEY_ID" setx OSS_ACCESS_KEY_SECRET "YOUR_ACCESS_KEY_SECRET" -
Rouvrez CMD et exécutez les commandes suivantes pour vérifier que les variables d'environnement sont définies.
echo %OSS_ACCESS_KEY_ID% echo %OSS_ACCESS_KEY_SECRET%
PowerShell
-
Dans PowerShell, exécutez les commandes suivantes.
[System.Environment]::SetEnvironmentVariable('OSS_ACCESS_KEY_ID', 'YOUR_ACCESS_KEY_ID', [System.EnvironmentVariableTarget]::User) [System.Environment]::SetEnvironmentVariable('OSS_ACCESS_KEY_SECRET', 'YOUR_ACCESS_KEY_SECRET', [System.EnvironmentVariableTarget]::User) -
Rouvrez PowerShell et exécutez les commandes suivantes pour vérifier que les variables d'environnement sont définies.
[System.Environment]::GetEnvironmentVariable('OSS_ACCESS_KEY_ID', [System.EnvironmentVariableTarget]::User) [System.Environment]::GetEnvironmentVariable('OSS_ACCESS_KEY_SECRET', [System.EnvironmentVariableTarget]::User)
-
Après avoir modifié les variables d'environnement système, redémarrez votre IDE et votre terminal pour que les modifications prennent effet.
-
Utilisez les variables d'environnement pour transmettre les identifiants.
Avant d'exécuter l'exemple de code, remplacez
<region-id>par un ID de région réel, tel quecn-hangzhou.#include "alibabacloud/oss2/ClientConfiguration.h" #include "alibabacloud/oss2/OSSClient.h" #include "alibabacloud/oss2/credentials/CredentialsProvider.h" namespace oss = alibabacloud::oss2; int main() { auto conf = oss::ClientConfiguration::loadDefault(); conf.region = "<region-id>"; conf.credentialsProvider = std::make_shared<oss::EnvironmentVariableCredentialsProvider>(); oss::OSSClient client(conf); // Use the client to perform operations. return 0; }
Explicitement dans le code
Vous pouvez fournir explicitement l'ID de clé d'accès et le secret de clé d'accès en utilisant StaticCredentialsProvider.
Cette méthode expose votre clé d'accès dans le code et est recommandée uniquement à des fins de test. Pour les environnements de production, utilisez une méthode plus sécurisée, telle que les variables d'environnement.
#include "alibabacloud/oss2/ClientConfiguration.h"
#include "alibabacloud/oss2/OSSClient.h"
#include "alibabacloud/oss2/credentials/CredentialsProvider.h"
namespace oss = alibabacloud::oss2;
int main() {
auto conf = oss::ClientConfiguration::loadDefault();
conf.region = "<region-id>";
conf.credentialsProvider = std::make_shared<oss::StaticCredentialsProvider>(
"YOUR_ACCESS_KEY_ID", "YOUR_ACCESS_KEY_SECRET");
oss::OSSClient client(conf);
// Use the client to perform operations.
return 0;
}
Identifiants temporaires STS
Les identifiants temporaires STS se composent d'un ID de clé d'accès, d'un secret de clé d'accès et d'un jeton de sécurité. Vous devez gérer et actualiser manuellement ce jeton.
Pour obtenir un identifiant temporaire STS à l'aide d'un SDK, consultez la rubrique Utilisation d'identifiants temporaires STS pour accéder à OSS.
Lors de la génération d'un jeton STS, vous devez spécifier une durée d'expiration. Le jeton devient automatiquement invalide après cette échéance.
Notez que les ID de clé d'accès obtenus via STS commencent par le préfixe
STS, par exemple :STS.L4aBSCSJVMuKg5U1****.
Variables d'environnement (recommandé)
Obtenez les identifiants temporaires en utilisant les variables d'environnement OSS_ACCESS_KEY_ID, OSS_ACCESS_KEY_SECRET et OSS_SESSION_TOKEN.
-
Définissez les variables d'environnement avec les identifiants temporaires.
macOS, Linux ou Unix
export OSS_ACCESS_KEY_ID=<STS_ACCESS_KEY_ID> export OSS_ACCESS_KEY_SECRET=<STS_ACCESS_KEY_SECRET> export OSS_SESSION_TOKEN=<STS_SECURITY_TOKEN>Windows
set OSS_ACCESS_KEY_ID=<STS_ACCESS_KEY_ID> set OSS_ACCESS_KEY_SECRET=<STS_ACCESS_KEY_SECRET> set OSS_SESSION_TOKEN=<STS_SECURITY_TOKEN> -
Utilisez les variables d'environnement pour transmettre les identifiants. Le fournisseur
EnvironmentVariableCredentialsProviderdu SDK lit automatiquement ces trois variables.Avant d'exécuter l'exemple de code, remplacez
<region-id>par un ID de région réel, tel quecn-hangzhou.#include "alibabacloud/oss2/ClientConfiguration.h" #include "alibabacloud/oss2/OSSClient.h" #include "alibabacloud/oss2/credentials/CredentialsProvider.h" namespace oss = alibabacloud::oss2; int main() { auto conf = oss::ClientConfiguration::loadDefault(); conf.region = "<region-id>"; // Automatically reads OSS_ACCESS_KEY_ID, OSS_ACCESS_KEY_SECRET, and OSS_SESSION_TOKEN. conf.credentialsProvider = std::make_shared<oss::EnvironmentVariableCredentialsProvider>(); oss::OSSClient client(conf); // Use the client to perform operations. return 0; }
Explicitement dans le code
Vous pouvez fournir explicitement l'ID de clé d'accès temporaire, le secret de clé d'accès et le jeton de sécurité en utilisant le fournisseur StaticCredentialsProvider.
Réservé aux tests. N'intégrez pas d'identifiants dans le code de production. Privilégiez l'utilisation de variables d'environnement ou d'une méthode SDK avec actualisation automatique.
#include "alibabacloud/oss2/ClientConfiguration.h"
#include "alibabacloud/oss2/OSSClient.h"
#include "alibabacloud/oss2/credentials/CredentialsProvider.h"
namespace oss = alibabacloud::oss2;
int main() {
auto conf = oss::ClientConfiguration::loadDefault();
conf.region = "<region-id>";
conf.credentialsProvider = std::make_shared<oss::StaticCredentialsProvider>(
"STS_ACCESS_KEY_ID", "STS_ACCESS_KEY_SECRET", "STS_SECURITY_TOKEN");
oss::OSSClient client(conf);
// Use the client to perform operations.
return 0;
}
RAMRoleARN, ECSRAMRole ou OIDCRoleARN
Pour les méthodes d'identification telles que RAMRoleARN, ECSRAMRole et OIDCRoleARN, nous recommandons d'utiliser la bibliothèque alibabacloud-credentials-cpp avec le fournisseur CredentialsProviderFunc.
-
Installez la dépendance.
vcpkg install alibabacloud-credentials-cpp -
Ajoutez la dépendance dans votre fichier CMakeLists.txt.
find_package(alibabacloud_credentials REQUIRED) -
Intégrez la bibliothèque en utilisant
CredentialsProviderFunc.RAMRoleARN
#include "alibabacloud/oss2/ClientConfiguration.h" #include "alibabacloud/oss2/OSSClient.h" #include "alibabacloud/oss2/credentials/CredentialsProvider.h" #include <darabonba/core/Client.hpp> #include <alibabacloud/credential.hpp> namespace oss = alibabacloud::oss2; int main() { auto credConfig = std::make_shared<Alibabacloud_Credential::Config>(); // The credential type must be ram_role_arn. credConfig->type = std::make_shared<std::string>("ram_role_arn"); // The access key ID of the RAM user. To avoid hardcoding, we recommend injecting this value through the ALIBABA_CLOUD_ACCESS_KEY_ID environment variable. credConfig->accessKeyId = std::make_shared<std::string>("YOUR_ACCESS_KEY_ID"); // The access key secret of the RAM user. To avoid hardcoding, we recommend injecting this value through the ALIBABA_CLOUD_ACCESS_KEY_SECRET environment variable. credConfig->accessKeySecret = std::make_shared<std::string>("YOUR_ACCESS_KEY_SECRET"); // The ARN of the RAM role to assume. Example: acs:ram::123456789012****:role/adminrole // You can also set this value by using the ALIBABA_CLOUD_ROLE_ARN environment variable. credConfig->roleArn = std::make_shared<std::string>("YOUR_ROLE_ARN"); // The role session name, used for auditing purposes. You can also set this value by using the ALIBABA_CLOUD_ROLE_SESSION_NAME environment variable. credConfig->roleSessionName = std::make_shared<std::string>("your-session-name"); // (Optional) Further restrict permissions with a policy. This parameter is not required. // Example: {"Statement":[{"Action":["oss:GetObject"],"Effect":"Allow","Resource":["*"]}],"Version":"1"} // credConfig->policy = std::make_shared<std::string>("<Policy>"); // (Optional) The role session duration in seconds. Default: 3600 (1 hour). This parameter is not required. // credConfig->roleSessionExpiration = std::make_shared<long>(3600); auto credClient = std::make_shared<Alibabacloud_Credential::Client>(credConfig); auto conf = oss::ClientConfiguration::loadDefault(); conf.region = "<region-id>"; conf.credentialsProvider = std::make_shared<oss::CredentialsProviderFunc>( [credClient]() -> oss::Credentials { auto cred = credClient->getCredential(); auto ak = cred.getAccessKeyId(); auto sk = cred.getAccessKeySecret(); if (ak.empty() || sk.empty()) { return oss::Credentials::withRetryableError( "failed to get credentials from alibabacloud-credentials-cpp"); } auto token = cred.getSecurityToken(); return oss::Credentials(std::move(ak), std::move(sk), std::move(token)); }); oss::OSSClient client(conf); // Use the client to perform operations. return 0; }ECSRAMRole
#include "alibabacloud/oss2/ClientConfiguration.h" #include "alibabacloud/oss2/OSSClient.h" #include "alibabacloud/oss2/credentials/CredentialsProvider.h" #include <darabonba/core/Client.hpp> #include <alibabacloud/credential.hpp> namespace oss = alibabacloud::oss2; int main() { auto credConfig = std::make_shared<Alibabacloud_Credential::Config>(); // The credential type must be ecs_ram_role. credConfig->type = std::make_shared<std::string>("ecs_ram_role"); // The name of the RAM role granted to the ECS instance. This parameter is optional. // If you do not set it, the SDK automatically retrieves it from the metadata service. // We strongly recommend setting this parameter explicitly to reduce requests to the metadata service. credConfig->roleName = std::make_shared<std::string>("YOUR_ECS_ROLE_NAME"); auto credClient = std::make_shared<Alibabacloud_Credential::Client>(credConfig); auto conf = oss::ClientConfiguration::loadDefault(); conf.region = "<region-id>"; conf.credentialsProvider = std::make_shared<oss::CredentialsProviderFunc>( [credClient]() -> oss::Credentials { auto cred = credClient->getCredential(); auto ak = cred.getAccessKeyId(); auto sk = cred.getAccessKeySecret(); if (ak.empty() || sk.empty()) { return oss::Credentials::withRetryableError( "failed to get credentials from alibabacloud-credentials-cpp"); } auto token = cred.getSecurityToken(); return oss::Credentials(std::move(ak), std::move(sk), std::move(token)); }); oss::OSSClient client(conf); // Use the client to perform operations. return 0; }OIDCRoleARN
#include "alibabacloud/oss2/ClientConfiguration.h" #include "alibabacloud/oss2/OSSClient.h" #include "alibabacloud/oss2/credentials/CredentialsProvider.h" #include <darabonba/core/Client.hpp> #include <alibabacloud/credential.hpp> namespace oss = alibabacloud::oss2; int main() { auto credConfig = std::make_shared<Alibabacloud_Credential::Config>(); // The credential type must be oidc_role_arn. credConfig->type = std::make_shared<std::string>("oidc_role_arn"); // The ARN of the RAM role to assume. You can also set this value by using the ALIBABA_CLOUD_ROLE_ARN environment variable. credConfig->roleArn = std::make_shared<std::string>("YOUR_ROLE_ARN"); // The ARN of the OIDC identity provider. You can also set this value by using the ALIBABA_CLOUD_OIDC_PROVIDER_ARN environment variable. credConfig->oidcProviderArn = std::make_shared<std::string>("YOUR_OIDC_PROVIDER_ARN"); // The path to the OIDC token file, which is automatically mounted into the pod by RRSA. You can also set this value by using the ALIBABA_CLOUD_OIDC_TOKEN_FILE environment variable. credConfig->oidcTokenFilePath = std::make_shared<std::string>("/var/run/secrets/tokens/oidc-token"); // The role session name, used for auditing purposes. You can also set this value by using the ALIBABA_CLOUD_ROLE_SESSION_NAME environment variable. credConfig->roleSessionName = std::make_shared<std::string>("your-session-name"); // (Optional) Further restrict permissions with a policy. This parameter is not required. // credConfig->policy = std::make_shared<std::string>("<Policy>"); auto credClient = std::make_shared<Alibabacloud_Credential::Client>(credConfig); auto conf = oss::ClientConfiguration::loadDefault(); conf.region = "<region-id>"; conf.credentialsProvider = std::make_shared<oss::CredentialsProviderFunc>( [credClient]() -> oss::Credentials { auto cred = credClient->getCredential(); auto ak = cred.getAccessKeyId(); auto sk = cred.getAccessKeySecret(); if (ak.empty() || sk.empty()) { return oss::Credentials::withRetryableError( "failed to get credentials from alibabacloud-credentials-cpp"); } auto token = cred.getSecurityToken(); return oss::Credentials(std::move(ak), std::move(sk), std::move(token)); }); oss::OSSClient client(conf); // Use the client to perform operations. return 0; }Plus d'exemples d'identifiants : exemples d'identifiants.
Accès anonyme
Accédez aux compartiments et objets publics (public-read) sans utiliser d'identifiants.
#include "alibabacloud/oss2/ClientConfiguration.h"
#include "alibabacloud/oss2/OSSClient.h"
#include "alibabacloud/oss2/credentials/CredentialsProvider.h"
namespace oss = alibabacloud::oss2;
int main() {
auto conf = oss::ClientConfiguration::loadDefault();
conf.region = "<region-id>";
conf.credentialsProvider = std::make_shared<oss::AnonymousCredentialsProvider>();
oss::OSSClient client(conf);
// Use the client to perform operations.
return 0;
}
Fournisseur d'identifiants personnalisé
Implémentez une logique personnalisée de récupération des identifiants avec CredentialsProviderFunc.
#include "alibabacloud/oss2/ClientConfiguration.h"
#include "alibabacloud/oss2/OSSClient.h"
#include "alibabacloud/oss2/credentials/CredentialsProvider.h"
#include <cstdlib>
namespace oss = alibabacloud::oss2;
// Example: Load credentials from custom environment variables or a configuration file.
static oss::Credentials loadCredentialsFromCustomSource() {
// In a real-world application, you can retrieve credentials from various sources:
// - A configuration file (such as ~/.ossrc)
// - A key management service (such as HashiCorp Vault or KMS)
// - A metadata service
// - A database
const char* ak = std::getenv("MY_APP_ACCESS_KEY_ID");
const char* sk = std::getenv("MY_APP_ACCESS_KEY_SECRET");
const char* token = std::getenv("MY_APP_SESSION_TOKEN");
if (!ak || !sk) {
// The error message propagates to OperationError::getMessage().
return oss::Credentials::withError(
"MY_APP_ACCESS_KEY_ID and MY_APP_ACCESS_KEY_SECRET must be set");
// For transient failures, such as network timeouts, use withRetryableError.
// The SDK automatically retries credential retrieval.
// return oss::Credentials::withRetryableError("...");
}
return oss::Credentials(ak, sk, token ? token : "");
}
int main() {
// The custom credential provider function is called every time credentials are required,
// allowing you to implement rotation, refresh, or caching logic.
auto provider = std::make_shared<oss::CredentialsProviderFunc>(
loadCredentialsFromCustomSource);
auto conf = oss::ClientConfiguration::loadDefault();
conf.region = "<region-id>";
conf.credentialsProvider = provider;
oss::OSSClient client(conf);
// Use the client to perform operations.
return 0;
}
Appel des opérations API
Les opérations API suivent une convention de nommage et un modèle d'appel cohérents.
Convention de nommage des API
Les noms de méthode utilisent le style camelCase. Chaque opération prend un paramètre <OperationName>Request et renvoie un résultat <OperationName>Outcome (de type Outcome<Result, Error>).
OSSClient (synchrone) :
OutcomeType operationName(const models::OperationNameRequest& request, const OperationOptions* options = nullptr)
OSSAsyncClient (asynchrone natif) :
void operationNameAsync(const models::OperationNameRequest& request, const OperationNameAsyncCallback& callback, const OperationOptions* options = nullptr)
Modes d'appel
|
Mode d'appel |
OSSClient |
OSSAsyncClient |
|
synchrone |
|
- |
|
asynchrone basé sur future |
|
|
|
asynchrone basé sur rappel |
|
|
Annulation d'une requête
Pour annuler des opérations de longue durée avec un CancellationToken, transmettez un cancellationToken dans les OperationOptions. Le SDK C++ V2 pour OSS propose deux modes d'annulation :
Annulation immédiate
Appelez CancellationTokenSource::cancel() depuis un autre thread pour interrompre une requête en cours.
// Cancel the request from another thread.
auto cts = oss::CancellationTokenSource::create();
oss::OperationOptions opts;
opts.cancellationToken = cts->getToken();
// Start the request in another thread.
auto future = std::async([&]() {
return client.getObject(request, &opts);
});
// Cancel from the current thread.
cts->cancel();
Annulation par délai
Appelez cancelAfter() pour définir un délai d'attente. Le SDK annule automatiquement la requête à l'expiration de ce délai.
// Set a 30-second timeout for automatic cancellation.
auto cts = oss::CancellationTokenSource::create();
cts->cancelAfter(std::chrono::seconds(30));
oss::OperationOptions opts;
opts.cancellationToken = cts->getToken();
auto outcome = client.getObject(request, &opts);
Gestion des erreurs
Le SDK C++ V2 pour OSS utilise le type Outcome<Result, Error>, compatible avec std::expected. Appelez has_value() pour vérifier le succès de l'opération. En cas de succès, récupérez le résultat avec value() ou en déréférençant l'objet outcome (*outcome). Sinon, récupérez l'objet d'erreur avec error().
auto outcome = client.putObject(request);
if (!outcome.has_value()) {
auto& err = outcome.error();
std::cerr << "Error code: " << err.getCode() << std::endl;
std::cerr << "Error message: " << err.getMessage() << std::endl;
std::cerr << "EC: " << err.getEC() << std::endl;
std::cerr << "Request ID: " << err.getRequestId() << std::endl;
std::cerr << "Request target: " << err.getRequestTarget() << std::endl;
}
Lors de la compilation avec l'option -DUSE_STD_EXPECTED=ON (C++23), Outcome devient un alias de type pour std::expected, qui prend en charge les opérations monadiques telles que .and_then(), .transform() et .or_else().
Exemples de code
Le tableau suivant répertorie les exemples de code disponibles.
|
Catégorie |
Description |
Version synchrone |
Version asynchrone |
|
Buckets |
Créer un bucket |
||
|
Répertorier les buckets |
|||
|
Supprimer un bucket |
|||
|
Obtenir les informations du bucket |
|||
|
Obtenir l'emplacement du bucket |
|||
|
Téléchargement d'objets |
Téléchargement simple |
||
|
Téléchargement par ajout (append) |
|||
|
Téléchargement multipartie |
|||
|
Copie multipartie |
|||
|
Téléchargement d'objets |
Téléchargement simple |
||
|
Copier un objet |
|||
|
Gestion des objets |
Répertorier les objets |
||
|
Répertorier les objets V2 |
|||
|
Supprimer un objet |
|||
|
Supprimer plusieurs objets |
|||
|
Obtenir les métadonnées de l'objet |
|||
|
Obtenir les métadonnées simplifiées de l'objet |
|||
|
Objets archivés |
Restaurer un objet |
||
|
Supprimer un objet restauré |
|||
|
Liens symboliques |
Créer un lien symbolique |
||
|
Obtenir un lien symbolique |
|||
|
Tagging d'objets |
Définir le tagging d'un objet |
||
|
Obtenir le tagging d'un objet |
|||
|
Supprimer le tagging d'un objet |
|||
|
Contrôle d'accès |
Définir l'ACL du bucket |
||
|
Obtenir l'ACL du bucket |
|||
|
Définir l'ACL de l'objet |
|||
|
Versioning |
Définir le versioning du bucket |
||
|
Obtenir l'état du versioning du bucket |
|||
|
Répertorier les versions d'objets |
|||
|
Protection contre le hotlinking |
Définir la protection contre le hotlinking |
||
|
Obtenir la configuration de protection contre le hotlinking |
|||
|
Fonctions système |
Interroger les informations sur l'endpoint |
||
|
URL pré-signée |
Générer une URL pré-signée pour le téléchargement |
- |
|
|
Générer une URL pré-signée pour l'upload |
- |
||
|
Générer une URL pré-signée pour une requête HEAD |
- |
||
|
Générer une URL pré-signée pour l'upload multipartie |
- |
||
|
API générique |
Utilisation de |
- |
|
|
Traitement des données |
Traiter un objet et enregistrer le résultat |
||
|
Soumettre une tâche de traitement d'objet asynchrone |
|||
|
Paginateur |
Répertorier tous les buckets |
- |
|
|
Répertorier tous les objets (recommandé) |
- |
||
|
Répertorier toutes les versions d'objets |
- |
||
|
Lister toutes les parties chargées |
- |
||
|
Lister tous les chargements multiparties |
- |
||
|
Lister tous les objets (méthode obsolète, non recommandée) |
- |
||
|
Exemples de scénarios |
Série |
- |
|
|
Opérations asynchrones avec |
- |
||
|
Autres exemples de scénarios |
- |