Gunakan OSS C++ SDK V2 untuk mengunggah, mengunduh, dan mengelola objek di Alibaba Cloud OSS dari aplikasi C++. SDK ini dirancang untuk skenario berkinerja tinggi, sistem tertanam, dan aplikasi desktop.
OSS C++ SDK V2 masih dalam tahap pratinjau. Antarmukanya dapat berubah. Periksa catatan rilis di repositori GitHub untuk pembaruan terbaru.
Mulai cepat
Lengkapi langkah-langkah berikut untuk menginstal SDK, mengonfigurasi kredensial, dan menginisialisasi klien.
Prasyarat
-
Kompilator C++17 atau yang lebih baru (GCC 7+, Clang 5+, atau MSVC 2017+).
-
CMake 3.15 atau yang lebih baru.
Jalankan perintah cmake --version untuk memeriksa versi CMake Anda. Jika CMake belum terinstal atau versinya lebih lama dari 3.15, unduh dan instal CMake.
Instal SDK
vcpkg adalah metode instalasi yang direkomendasikan.
vcpkg
Gunakan manajer paket vcpkg untuk menginstal SDK:
vcpkg install alibabacloud-oss-cpp-sdk-v2[curl]
# Di Windows, Anda dapat menggunakan WinHTTP sebagai lapisan transport HTTP.
vcpkg install alibabacloud-oss-cpp-sdk-v2[winhttp]
Anda juga dapat menginstal dari kode sumber dengan menggunakan overlay port:
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
Anda harus menentukan lapisan transport HTTP (curl atau winhttp), karena tidak ada yang diaktifkan secara default. Anda dapat mengaktifkan keduanya.
Jika openssl dan mbedtls keduanya diaktifkan, openssl akan diprioritaskan.
Fitur opsional:
|
Fitur |
Deskripsi |
|
|
Lapisan transport HTTP berbasis libcurl. Anda harus secara eksplisit menentukan |
|
|
Lapisan transport HTTP berbasis WinHTTP (hanya untuk Windows). |
|
|
Menggunakan OpenSSL untuk perhitungan hash. |
|
|
Menggunakan mbedTLS untuk perhitungan hash. |
|
|
Mengaktifkan enkripsi sisi client. Di platform non-Windows, Anda juga harus mengaktifkan |
|
|
Mengaktifkan informasi tipe waktu proses (RTTI) saat kompilasi. |
|
|
Menggunakan tinyxml2 yang terinstal di sistem alih-alih versi yang disertakan dalam SDK. |
Definisi lengkap: vcpkg/vcpkg.json.
Kode sumber
Unduh versi terbaru OSS C++ SDK V2 dari GitHub, lalu bangun dan instal dengan 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
Opsi CMake yang tersedia:
|
Opsi |
Deskripsi |
|
|
Membangun SDK sebagai pustaka bersama. Secara default, pustaka statis dibangun (OFF). |
|
|
Menggunakan libcurl sebagai lapisan transport HTTP. |
|
|
Menggunakan WinHTTP sebagai lapisan transport HTTP (hanya untuk Windows). |
|
|
Menggunakan libcurl yang terinstal di sistem alih-alih versi yang disertakan dalam SDK. |
|
|
Menggunakan OpenSSL yang terinstal di sistem. |
|
|
Menggunakan mbedTLS yang terinstal di sistem. |
|
|
Menggunakan tinyxml2 yang terinstal di sistem. |
|
|
Menggunakan |
|
|
Mengaktifkan enkripsi sisi client. |
|
|
Mengaktifkan informasi tipe waktu proses (RTTI). |
Tambahkan dependensi ke file CMakeLists.txt proyek Anda:
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)
Konfigurasi kredensial akses
Tetapkan variabel lingkungan dengan Pasangan Kunci Akses Pengguna RAM Anda.
Di Konsol RAM, buat Pengguna RAM dan hasilkan AccessKey permanen. Simpan AccessKey tersebut, lalu berikan izin AliyunOSSFullAccess kepada pengguna tersebut.
Linux
-
Di antarmuka baris perintah, jalankan perintah berikut untuk menambahkan variabel lingkungan ke file
~/.bashrcAnda.echo "export OSS_ACCESS_KEY_ID='YOUR_ACCESS_KEY_ID'" >> ~/.bashrc echo "export OSS_ACCESS_KEY_SECRET='YOUR_ACCESS_KEY_SECRET'" >> ~/.bashrc-
Jalankan perintah berikut untuk menerapkan perubahan.
source ~/.bashrc -
Jalankan perintah berikut untuk memverifikasi bahwa variabel lingkungan telah ditetapkan.
echo $OSS_ACCESS_KEY_ID echo $OSS_ACCESS_KEY_SECRET
-
macOS
-
Di terminal, jalankan perintah berikut untuk memeriksa shell default Anda.
echo $SHELL-
Langkah-langkah berikut bergantung pada shell default Anda.
Zsh
-
Jalankan perintah berikut untuk menambahkan variabel lingkungan ke file
~/.zshrcAnda.echo "export OSS_ACCESS_KEY_ID='YOUR_ACCESS_KEY_ID'" >> ~/.zshrc echo "export OSS_ACCESS_KEY_SECRET='YOUR_ACCESS_KEY_SECRET'" >> ~/.zshrc -
Jalankan perintah berikut untuk menerapkan perubahan.
source ~/.zshrc -
Jalankan perintah berikut untuk memverifikasi bahwa variabel lingkungan telah ditetapkan.
echo $OSS_ACCESS_KEY_ID echo $OSS_ACCESS_KEY_SECRET
Bash
-
Jalankan perintah berikut untuk menambahkan variabel lingkungan ke file
~/.bash_profileAnda.echo "export OSS_ACCESS_KEY_ID='YOUR_ACCESS_KEY_ID'" >> ~/.bash_profile echo "export OSS_ACCESS_KEY_SECRET='YOUR_ACCESS_KEY_SECRET'" >> ~/.bash_profile -
Jalankan perintah berikut untuk menerapkan perubahan.
source ~/.bash_profile -
Jalankan perintah berikut untuk memverifikasi bahwa variabel lingkungan telah ditetapkan.
echo $OSS_ACCESS_KEY_ID echo $OSS_ACCESS_KEY_SECRET
-
-
Windows
Command Prompt
-
Di Command Prompt (CMD), jalankan perintah berikut:
setx OSS_ACCESS_KEY_ID "YOUR_ACCESS_KEY_ID" setx OSS_ACCESS_KEY_SECRET "YOUR_ACCESS_KEY_SECRET" -
Buka kembali Command Prompt dan jalankan perintah berikut untuk memverifikasi bahwa variabel lingkungan telah ditetapkan.
echo %OSS_ACCESS_KEY_ID% echo %OSS_ACCESS_KEY_SECRET%
PowerShell
-
Di PowerShell, jalankan perintah berikut.
[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) -
Buka kembali PowerShell dan jalankan perintah berikut untuk memverifikasi bahwa variabel lingkungan telah ditetapkan.
[System.Environment]::GetEnvironmentVariable('OSS_ACCESS_KEY_ID', [System.EnvironmentVariableTarget]::User) [System.Environment]::GetEnvironmentVariable('OSS_ACCESS_KEY_SECRET', [System.EnvironmentVariableTarget]::User)
Inisialisasi client
SDK mendukung tiga mode permintaan: OSSClient (sinkron), OSSClient (asinkron) (berbasis kolam thread), dan OSSAsyncClient (asinkron) (asinkron native). Contoh berikut menggunakan ListBuckets untuk menunjukkan setiap mode.
OSSClient (sinkron)
Gunakan mode sinkron OSSClient ketika Anda perlu menunggu operasi selesai sebelum melanjutkan.
Sebelum menjalankan kode contoh, ganti<region-id>dengan wilayah dan titik akhir yang sebenarnya, sepertiap-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 (asinkron)
Mode asinkron berbasis kolam thread ini tetap menggunakan OSSClient. Setelah menyetel conf.executor (kolam thread), Anda memanggil asyncCall() untuk mengirimkan permintaan sinkron ke kolam thread guna eksekusi konkuren. Pemanggilan mengembalikan std::future, dan pemanggil menunggu hasilnya dengan get().
Jikaconf.executortidak disetel,asyncCall()mengembalikan errorNoExecutor.
#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>();
// Penting: Konfigurasikan kolam thread untuk mengaktifkan dukungan asyncCall() pada OSSClient.
conf.executor = std::make_shared<oss::DefaultExecutor>();
oss::OSSClient client(conf);
// Pemanggilan asinkron yang mengembalikan std::future.
auto future = client.asyncCall(oss::models::ListBucketsRequest());
// Tunggu hasilnya dengan get() (pola future).
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;
}
Contoh unggah dan unduh konkuren: AsyncCallOnSyncClient.cpp dan AsyncCallbackOnSyncClient.cpp.
OSSAsyncClient (asinkron)
Mode asinkron native ini menggunakan OSSAsyncClient. Setiap operasi memiliki metode operationNameAsync() yang sesuai yang menerima hasil melalui callback, sehingga tidak perlu mengonfigurasi kolam thread. Mode ini ideal untuk skenario yang memerlukan volume operasi konkuren tinggi.
Sebelum menjalankan kode contoh, ganti<region-id>dengan wilayah dan titik akhir yang sebenarnya, sepertiap-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;
}
}));
// Tunggu hingga operasi asinkron selesai.
std::this_thread::sleep_for(std::chrono::seconds(5));
return 0;
}
Output tersebut mencantumkan semua bucket dalam akun Anda di seluruh wilayah.
Konfigurasi client
Gunakan domain kustom
Domain kustom memungkinkan pratinjau file berbasis browser dan pengiriman yang dipercepat CDN.
Sebelum menjalankan kode contoh, ganti<region-id>dengan ID wilayah yang sebenarnya dari daftar wilayah dan titik akhir, sepertiap-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);
// Lakukan operasi menggunakan domain kustom.
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 << "Unggah berhasil" << std::endl;
return 0;
}
Kontrol waktu tunggu
Gunakan connectTimeout dan readWriteTimeout untuk mengonfigurasi waktu tunggu koneksi dan baca/tulis dalam milidetik.
auto conf = oss::ClientConfiguration::loadDefault();
conf.region = "<region-id>";
conf.credentialsProvider = std::make_shared<oss::EnvironmentVariableCredentialsProvider>();
// Atur waktu tunggu koneksi menjadi 10 detik.
conf.connectTimeout = 10000;
// Atur waktu tunggu baca/tulis menjadi 30 detik.
conf.readWriteTimeout = 30000;
oss::OSSClient client(conf);
Kebijakan percobaan ulang
StandardRetryer bawaan menggunakan strategi FullJitterBackoff dengan maksimal 3 kali percobaan ulang secara default. Gunakan retryMaxAttempts untuk menyesuaikan.
auto conf = oss::ClientConfiguration::loadDefault();
conf.region = "<region-id>";
conf.credentialsProvider = std::make_shared<oss::EnvironmentVariableCredentialsProvider>();
// Atur jumlah maksimum percobaan ulang menjadi 5.
conf.retryMaxAttempts = 5;
oss::OSSClient client(conf);
Contoh strategi percobaan ulang kustom: CustomRetryStrategy.cpp.
Protokol HTTP/HTTPS
Protokol HTTPS digunakan secara default. Untuk menggunakan protokol HTTP, atur disableSsl ke true.
auto conf = oss::ClientConfiguration::loadDefault();
conf.region = "<region-id>";
conf.credentialsProvider = std::make_shared<oss::EnvironmentVariableCredentialsProvider>();
// Gunakan protokol HTTP.
conf.disableSsl = true;
oss::OSSClient client(conf);
Gunakan titik akhir internal
Saat diterapkan di ECS, gunakan titik akhir internal untuk menghindari biaya lalu lintas jaringan publik.
auto conf = oss::ClientConfiguration::loadDefault();
conf.region = "<region-id>";
conf.credentialsProvider = std::make_shared<oss::EnvironmentVariableCredentialsProvider>();
// Gunakan titik akhir internal.
conf.useInternalEndpoint = true;
oss::OSSClient client(conf);
Gunakan titik akhir akselerasi transfer
Gunakan titik akhir akselerasi transfer untuk transfer data jarak jauh.
auto conf = oss::ClientConfiguration::loadDefault();
conf.region = "<region-id>";
conf.credentialsProvider = std::make_shared<oss::EnvironmentVariableCredentialsProvider>();
// Gunakan titik akhir akselerasi transfer.
conf.useAccelerateEndpoint = true;
oss::OSSClient client(conf);
Gunakan domain kustom (CNAME)
Akses OSS menggunakan domain kustom (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);
Kustomisasi transport HTTP
SDK menggunakan cURL secara default. Ganti melalui httpTransport. WinHTTP juga didukung di Windows.
Contoh transport kustom: CurlCustomConfig.cpp dan WinHttpCustomConfig.cpp.
Konfigurasi kredensial akses
SDK mendukung metode kredensial berikut:
Kunci akses Pengguna RAM
Gunakan kunci akses Pengguna RAM untuk aplikasi di lingkungan aman yang tidak terpapar internet.
Variabel lingkungan (Direkomendasikan)
Dapatkan kredensial dari variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET.
-
Tetapkan variabel lingkungan menggunakan kunci akses Pengguna RAM.
Linux
-
Dari baris perintah, jalankan perintah berikut untuk menambahkan pengaturan variabel lingkungan ke file
~/.bashrc.echo "export OSS_ACCESS_KEY_ID='YOUR_ACCESS_KEY_ID'" >> ~/.bashrc echo "export OSS_ACCESS_KEY_SECRET='YOUR_ACCESS_KEY_SECRET'" >> ~/.bashrc -
Jalankan perintah berikut untuk menerapkan perubahan.
source ~/.bashrc -
Jalankan perintah berikut untuk memverifikasi bahwa variabel lingkungan telah ditetapkan.
echo $OSS_ACCESS_KEY_ID echo $OSS_ACCESS_KEY_SECRET
macOS
-
Di terminal, jalankan perintah berikut untuk memeriksa jenis shell default Anda.
echo $SHELL -
Ikuti langkah-langkah berdasarkan jenis shell default Anda.
Zsh
-
Jalankan perintah berikut untuk menambahkan pengaturan variabel lingkungan ke file
~/.zshrc.echo "export OSS_ACCESS_KEY_ID='YOUR_ACCESS_KEY_ID'" >> ~/.zshrc echo "export OSS_ACCESS_KEY_SECRET='YOUR_ACCESS_KEY_SECRET'" >> ~/.zshrc -
Jalankan perintah berikut untuk menerapkan perubahan.
source ~/.zshrc -
Jalankan perintah berikut untuk memverifikasi bahwa variabel lingkungan telah ditetapkan.
echo $OSS_ACCESS_KEY_ID echo $OSS_ACCESS_KEY_SECRET
Bash
-
Jalankan perintah berikut untuk menambahkan pengaturan variabel lingkungan ke file
~/.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 -
Jalankan perintah berikut untuk menerapkan perubahan.
source ~/.bash_profile -
Jalankan perintah berikut untuk memverifikasi bahwa variabel lingkungan telah ditetapkan.
echo $OSS_ACCESS_KEY_ID echo $OSS_ACCESS_KEY_SECRET
-
Windows
CMD
-
Di CMD, jalankan perintah berikut.
setx OSS_ACCESS_KEY_ID "YOUR_ACCESS_KEY_ID" setx OSS_ACCESS_KEY_SECRET "YOUR_ACCESS_KEY_SECRET" -
Buka kembali CMD dan jalankan perintah berikut untuk memverifikasi bahwa variabel lingkungan telah ditetapkan.
echo %OSS_ACCESS_KEY_ID% echo %OSS_ACCESS_KEY_SECRET%
PowerShell
-
Di PowerShell, jalankan perintah berikut.
[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) -
Buka kembali PowerShell dan jalankan perintah berikut untuk memverifikasi bahwa variabel lingkungan telah ditetapkan.
[System.Environment]::GetEnvironmentVariable('OSS_ACCESS_KEY_ID', [System.EnvironmentVariableTarget]::User) [System.Environment]::GetEnvironmentVariable('OSS_ACCESS_KEY_SECRET', [System.EnvironmentVariableTarget]::User)
-
-
Setelah mengubah variabel lingkungan sistem, mulai ulang IDE dan terminal agar perubahan berlaku.
-
Gunakan variabel lingkungan untuk meneruskan kredensial.
Sebelum menjalankan kode contoh, ganti
<region-id>dengan ID wilayah yang sebenarnya, seperticn-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); // Gunakan client untuk melakukan operasi. return 0; }
Secara eksplisit dalam kode
Anda dapat memberikan secara eksplisit ID kunci akses dan rahasia kunci akses menggunakan StaticCredentialsProvider.
Metode ini mengekspos kunci akses Anda dalam kode dan hanya direkomendasikan untuk tujuan pengujian. Untuk lingkungan produksi, gunakan metode yang lebih aman, seperti variabel lingkungan.
#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);
// Gunakan client untuk melakukan operasi.
return 0;
}
Kredensial sementara STS
Kredensial sementara STS terdiri dari ID kunci akses, rahasia kunci akses, dan token keamanan. Anda harus mengelola dan menyegarkan token secara manual.
-
Untuk mendapatkan kredensial sementara STS menggunakan SDK, lihat Gunakan kredensial sementara STS untuk mengakses OSS.
-
Saat menghasilkan token STS, Anda harus menentukan waktu kedaluwarsa. Token secara otomatis menjadi tidak valid setelah kedaluwarsa.
-
Perhatikan bahwa ID kunci akses yang diperoleh dari STS diawali dengan awalan
STS, misalnya,STS.L4aBSCSJVMuKg5U1****.
Variabel lingkungan (Direkomendasikan)
Dapatkan kredensial sementara menggunakan variabel lingkungan OSS_ACCESS_KEY_ID, OSS_ACCESS_KEY_SECRET, dan OSS_SESSION_TOKEN.
-
Tetapkan variabel lingkungan menggunakan kredensial sementara.
macOS, Linux, atau 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> -
Gunakan variabel lingkungan untuk meneruskan kredensial.
EnvironmentVariableCredentialsProviderSDK secara otomatis membaca ketiga variabel lingkungan ini.Sebelum menjalankan kode contoh, ganti
<region-id>dengan ID wilayah yang sebenarnya, seperticn-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>"; // Secara otomatis membaca OSS_ACCESS_KEY_ID, OSS_ACCESS_KEY_SECRET, dan OSS_SESSION_TOKEN. conf.credentialsProvider = std::make_shared<oss::EnvironmentVariableCredentialsProvider>(); oss::OSSClient client(conf); // Gunakan client untuk melakukan operasi. return 0; }
Secara eksplisit dalam kode
Anda dapat memberikan secara eksplisit ID kunci akses sementara, rahasia kunci akses, dan token keamanan menggunakan StaticCredentialsProvider.
Hanya untuk pengujian. Jangan menyematkan kredensial dalam kode produksi. Gunakan variabel lingkungan atau metode SDK yang menyegarkan otomatis.
#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);
// Gunakan client untuk melakukan operasi.
return 0;
}
RAMRoleARN, ECSRAMRole, atau OIDCRoleARN
Untuk metode kredensial seperti RAMRoleARN, ECSRAMRole, dan OIDCRoleARN, kami merekomendasikan menggunakan pustaka alibabacloud-credentials-cpp dengan CredentialsProviderFunc.
-
Instal dependensi.
vcpkg install alibabacloud-credentials-cpp -
Tambahkan dependensi dalam file CMakeLists.txt Anda.
find_package(alibabacloud_credentials REQUIRED) -
Integrasikan pustaka menggunakan
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>(); // Jenis kredensial harus ram_role_arn. credConfig->type = std::make_shared<std::string>("ram_role_arn"); // ID kunci akses Pengguna RAM. Untuk menghindari hardcoding, kami merekomendasikan menyuntikkan nilai ini melalui variabel lingkungan ALIBABA_CLOUD_ACCESS_KEY_ID. credConfig->accessKeyId = std::make_shared<std::string>("YOUR_ACCESS_KEY_ID"); // Rahasia kunci akses Pengguna RAM. Untuk menghindari hardcoding, kami merekomendasikan menyuntikkan nilai ini melalui variabel lingkungan ALIBABA_CLOUD_ACCESS_KEY_SECRET. credConfig->accessKeySecret = std::make_shared<std::string>("YOUR_ACCESS_KEY_SECRET"); // ARN peran RAM yang akan diasumsikan. Contoh: acs:ram::123456789012****:role/adminrole // Anda juga dapat menyetel nilai ini menggunakan variabel lingkungan ALIBABA_CLOUD_ROLE_ARN. credConfig->roleArn = std::make_shared<std::string>("YOUR_ROLE_ARN"); // Nama sesi peran, digunakan untuk tujuan audit. Anda juga dapat menyetel nilai ini menggunakan variabel lingkungan ALIBABA_CLOUD_ROLE_SESSION_NAME. credConfig->roleSessionName = std::make_shared<std::string>("your-session-name"); // (Opsional) Batasi lebih lanjut izin dengan kebijakan. Parameter ini tidak wajib. // Contoh: {"Statement":[{"Action":["oss:GetObject"],"Effect":"Allow","Resource":["*"]}],"Version":"1"} // credConfig->policy = std::make_shared<std::string>("<Policy>"); // (Opsional) Durasi sesi peran dalam detik. Default: 3600 (1 jam). Parameter ini tidak wajib. // 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); // Gunakan client untuk melakukan operasi. 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>(); // Jenis kredensial harus ecs_ram_role. credConfig->type = std::make_shared<std::string>("ecs_ram_role"); // Nama peran RAM yang diberikan ke instans ECS. Parameter ini opsional. // Jika tidak disetel, SDK secara otomatis mengambilnya dari layanan metadata. // Kami sangat menyarankan menyetel parameter ini secara eksplisit untuk mengurangi permintaan ke layanan metadata. 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); // Gunakan client untuk melakukan operasi. 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>(); // Jenis kredensial harus oidc_role_arn. credConfig->type = std::make_shared<std::string>("oidc_role_arn"); // ARN peran RAM yang akan diasumsikan. Anda juga dapat menyetel nilai ini menggunakan variabel lingkungan ALIBABA_CLOUD_ROLE_ARN. credConfig->roleArn = std::make_shared<std::string>("YOUR_ROLE_ARN"); // ARN penyedia identitas OIDC. Anda juga dapat menyetel nilai ini menggunakan variabel lingkungan ALIBABA_CLOUD_OIDC_PROVIDER_ARN. credConfig->oidcProviderArn = std::make_shared<std::string>("YOUR_OIDC_PROVIDER_ARN"); // Jalur ke file token OIDC, yang secara otomatis dimount ke pod oleh RRSA. Anda juga dapat menyetel nilai ini menggunakan variabel lingkungan ALIBABA_CLOUD_OIDC_TOKEN_FILE. credConfig->oidcTokenFilePath = std::make_shared<std::string>("/var/run/secrets/tokens/oidc-token"); // Nama sesi peran, digunakan untuk tujuan audit. Anda juga dapat menyetel nilai ini menggunakan variabel lingkungan ALIBABA_CLOUD_ROLE_SESSION_NAME. credConfig->roleSessionName = std::make_shared<std::string>("your-session-name"); // (Opsional) Batasi lebih lanjut izin dengan kebijakan. Parameter ini tidak wajib. // 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); // Gunakan client untuk melakukan operasi. return 0; }Lebih banyak contoh kredensial: contoh kredensial.
Akses anonim
Akses bucket dan objek baca-publik tanpa kredensial.
#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);
// Gunakan client untuk melakukan operasi.
return 0;
}
Penyedia kredensial kustom
Implementasikan logika pengambilan kredensial kustom dengan CredentialsProviderFunc.
#include "alibabacloud/oss2/ClientConfiguration.h"
#include "alibabacloud/oss2/OSSClient.h"
#include "alibabacloud/oss2/credentials/CredentialsProvider.h"
#include <cstdlib>
namespace oss = alibabacloud::oss2;
// Contoh: Muat kredensial dari variabel lingkungan kustom atau file konfigurasi.
static oss::Credentials loadCredentialsFromCustomSource() {
// Dalam aplikasi dunia nyata, Anda dapat mengambil kredensial dari berbagai sumber:
// - File konfigurasi (seperti ~/.ossrc)
// - Layanan manajemen kunci (seperti HashiCorp Vault atau KMS)
// - Layanan metadata
// - 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) {
// Pesan error ini akan diteruskan ke OperationError::getMessage().
return oss::Credentials::withError(
"MY_APP_ACCESS_KEY_ID dan MY_APP_ACCESS_KEY_SECRET harus disetel");
// Untuk kegagalan sementara, seperti timeout jaringan, gunakan withRetryableError.
// SDK secara otomatis mencoba ulang pengambilan kredensial.
// return oss::Credentials::withRetryableError("...");
}
return oss::Credentials(ak, sk, token ? token : "");
}
int main() {
// Fungsi penyedia kredensial kustom dipanggil setiap kali kredensial diperlukan,
// memungkinkan Anda mengimplementasikan logika rotasi, penyegaran, atau caching.
auto provider = std::make_shared<oss::CredentialsProviderFunc>(
loadCredentialsFromCustomSource);
auto conf = oss::ClientConfiguration::loadDefault();
conf.region = "<region-id>";
conf.credentialsProvider = provider;
oss::OSSClient client(conf);
// Gunakan client untuk melakukan operasi.
return 0;
}
Memanggil operasi API
Operasi API mengikuti konvensi penamaan dan pola pemanggilan yang konsisten.
Konvensi penamaan API
Nama metode menggunakan gaya camelCase. Setiap operasi menerima parameter <OperationName>Request dan mengembalikan <OperationName>Outcome (Outcome<Result, Error>).
OSSClient (sinkron):
OutcomeType operationName(const models::OperationNameRequest& request, const OperationOptions* options = nullptr)
OSSAsyncClient (asinkron native):
void operationNameAsync(const models::OperationNameRequest& request, const OperationNameAsyncCallback& callback, const OperationOptions* options = nullptr)
Mode pemanggilan
|
Mode pemanggilan |
OSSClient |
OSSAsyncClient |
|
sinkron |
|
- |
|
asinkron berbasis future |
|
|
|
asinkron berbasis callback |
|
|
Membatalkan permintaan
Untuk membatalkan operasi berjalan lama dengan CancellationToken, teruskan cancellationToken dalam OperationOptions. OSS C++ SDK V2 menyediakan dua mode pembatalan:
Batalkan segera
Panggil CancellationTokenSource::cancel() dari thread lain untuk menginterupsi permintaan yang sedang berlangsung.
// Batalkan permintaan dari thread lain.
auto cts = oss::CancellationTokenSource::create();
oss::OperationOptions opts;
opts.cancellationToken = cts->getToken();
// Mulai permintaan di thread lain.
auto future = std::async([&]() {
return client.getObject(request, &opts);
});
// Batalkan dari thread saat ini.
cts->cancel();
Batalkan berdasarkan tenggat waktu
Panggil cancelAfter() untuk menetapkan waktu tunggu. SDK secara otomatis membatalkan permintaan ketika waktu tunggu habis.
// Tetapkan waktu tunggu 30 detik untuk pembatalan otomatis.
auto cts = oss::CancellationTokenSource::create();
cts->cancelAfter(std::chrono::seconds(30));
oss::OperationOptions opts;
opts.cancellationToken = cts->getToken();
auto outcome = client.getObject(request, &opts);
Penanganan error
OSS C++ SDK V2 menggunakan Outcome<Result, Error>, yang kompatibel dengan std::expected. Panggil has_value() untuk memeriksa keberhasilan. Jika berhasil, ambil hasilnya dengan value() atau dengan mendereferensiasi objek outcome (*outcome). Jika tidak, ambil objek error dengan error().
auto outcome = client.putObject(request);
if (!outcome.has_value()) {
auto& err = outcome.error();
std::cerr << "Kode error: " << err.getCode() << std::endl;
std::cerr << "Pesan error: " << err.getMessage() << std::endl;
std::cerr << "EC: " << err.getEC() << std::endl;
std::cerr << "ID Permintaan: " << err.getRequestId() << std::endl;
std::cerr << "Target permintaan: " << err.getRequestTarget() << std::endl;
}
Saat Anda membangun dengan flag -DUSE_STD_EXPECTED=ON (C++23), Outcome menjadi alias tipe untuk std::expected, yang mendukung operasi monadik seperti .and_then(), .transform(), dan .or_else().
Kode contoh
Tabel berikut mencantumkan kode contoh yang tersedia.
|
Kategori |
Deskripsi |
Versi sinkron |
Versi asinkron |
|
Bucket |
Buat bucket |
||
|
Daftar bucket |
|||
|
Hapus bucket |
|||
|
Dapatkan informasi bucket |
|||
|
Dapatkan lokasi bucket |
|||
|
Unggah objek |
Unggah sederhana |
||
|
Unggah Lampiran |
|||
|
Unggah multi-bagian |
|||
|
Salin multi-bagian |
|||
|
Unduh objek |
Unduh sederhana |
||
|
Salin objek |
|||
|
Manajemen objek |
Daftar objek |
||
|
Daftar objek V2 |
|||
|
Hapus objek |
|||
|
Hapus beberapa objek |
|||
|
Dapatkan metadata objek |
|||
|
Dapatkan metadata objek sederhana |
|||
|
Objek arsip |
Pulihkan objek |
||
|
Hapus objek yang dipulihkan |
|||
|
Tautan simbolik |
Buat tautan simbolik |
||
|
Dapatkan tautan simbolik |
|||
|
Penandaan objek |
Tetapkan penandaan objek |
||
|
Dapatkan penandaan objek |
|||
|
Hapus penandaan objek |
|||
|
Kontrol akses |
Tetapkan ACL bucket |
||
|
Dapatkan ACL bucket |
|||
|
Tetapkan ACL objek |
|||
|
Pengendalian versi |
Tetapkan pengendalian versi bucket |
||
|
Dapatkan status pengendalian versi bucket |
|||
|
Daftar versi objek |
|||
|
Perlindungan hotlink |
Tetapkan perlindungan hotlink |
||
|
Dapatkan konfigurasi perlindungan hotlink |
|||
|
Fungsi sistem |
Kueri informasi titik akhir |
||
|
URL yang ditandatangani |
Hasilkan URL yang ditandatangani untuk unduh |
- |
|
|
Hasilkan URL yang ditandatangani untuk unggah |
- |
||
|
Hasilkan URL yang ditandatangani untuk permintaan HEAD |
- |
||
|
Hasilkan URL yang ditandatangani untuk unggah multi-bagian |
- |
||
|
API generik |
Menggunakan |
- |
|
|
Pemrosesan data |
Proses objek dan simpan hasilnya |
||
|
Kirimkan tugas pemrosesan objek asinkron |
|||
|
Paginator |
Daftar semua bucket |
- |
|
|
Daftar semua objek (direkomendasikan) |
- |
||
|
Daftar semua versi objek |
- |
||
|
Daftar semua bagian yang diunggah |
- |
||
|
Daftar semua unggah multi-bagian |
- |
||
|
Daftar semua objek (lawas, tidak direkomendasikan) |
- |
||
|
Contoh skenario |
Seri |
- |
|
|
Operasi asinkron dengan |
- |
||
|
Lebih banyak contoh skenario |
- |