OSS C++ SDK V2 menghubungkan aplikasi C++ Anda ke Alibaba Cloud Object Storage Service (OSS), memungkinkan Anda mengunggah, mengunduh, dan mengelola file. SDK ini ideal untuk skenario berkinerja tinggi, sistem embedded, serta aplikasi desktop yang memerlukan penyimpanan file di cloud.
OSS C++ SDK V2 masih dalam tahap pratinjau, dan antarmukanya dapat berubah. Untuk pembaruan terbaru, lihat catatan rilis di repositori GitHub.
Mulai cepat
Ikuti langkah-langkah berikut untuk mulai menggunakan OSS C++ SDK V2.
Prasyarat
Kompilator C++17 atau versi lebih baru (GCC 7+, Clang 5+, atau MSVC 2017+).
CMake 3.15 atau versi 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
Kami menyarankan menggunakan vcpkg untuk menginstal OSS C++ SDK V2.
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 --headAnda 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.
vcpkg menyediakan fitur opsional berikut yang dapat Anda aktifkan sesuai kebutuhan.
Fitur | Deskripsi |
| Lapisan transport HTTP berbasis libcurl. Anda harus secara eksplisit menentukan |
| Lapisan transport HTTP berbasis WinHTTP (khusus Windows). |
| Menggunakan OpenSSL untuk perhitungan hash. |
| Menggunakan mbedTLS untuk perhitungan hash. |
| Mengaktifkan enkripsi sisi klien. Di platform non-Windows, Anda juga harus mengaktifkan |
| Mengaktifkan informasi tipe waktu proses (RTTI) saat kompilasi. |
Untuk definisi lengkap, lihat 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 installSaat Anda mengompilasi dari kode sumber, opsi CMake berikut 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 (khusus Windows). |
| Menggunakan libcurl yang terinstal di sistem alih-alih versi yang disertakan dengan SDK. |
| Menggunakan OpenSSL yang terinstal di sistem. |
| Menggunakan mbedTLS yang terinstal di sistem. |
| Menggunakan |
| Mengaktifkan enkripsi sisi klien. |
| 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)Konfigurasikan kredensial akses
Konfigurasikan kredensial akses dengan menyetel variabel lingkungan menggunakan AccessKey Pengguna RAM Anda.
Di Konsol RAM, buat Pengguna RAM dan hasilkan AccessKey permanen. Simpan AccessKey tersebut, lalu berikan izin AliyunOSSFullAccess kepada pengguna.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'" >> ~/.bashrcJalankan perintah berikut untuk menerapkan perubahan.
source ~/.bashrcJalankan perintah berikut untuk memverifikasi bahwa variabel lingkungan telah disetel.
echo $OSS_ACCESS_KEY_ID echo $OSS_ACCESS_KEY_SECRET
macOS
Di terminal, jalankan perintah berikut untuk memeriksa shell default Anda.
echo $SHELLLangkah-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'" >> ~/.zshrcJalankan perintah berikut untuk menerapkan perubahan.
source ~/.zshrcJalankan perintah berikut untuk memverifikasi bahwa variabel lingkungan telah disetel.
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_profileJalankan perintah berikut untuk menerapkan perubahan.
source ~/.bash_profileJalankan perintah berikut untuk memverifikasi bahwa variabel lingkungan telah disetel.
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 disetel.
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 disetel.
[System.Environment]::GetEnvironmentVariable('OSS_ACCESS_KEY_ID', [System.EnvironmentVariableTarget]::User) [System.Environment]::GetEnvironmentVariable('OSS_ACCESS_KEY_SECRET', [System.EnvironmentVariableTarget]::User)
Inisialisasi klien
SDK menyediakan tiga mode permintaan: OSSClient (sinkron), OSSClient (asinkron) (permintaan asinkron berbasis kolam thread), dan OSSAsyncClient (asinkron) (permintaan asinkron native). Pilih mode berdasarkan kasus penggunaan Anda. Contoh berikut menunjukkan setiap mode dengan menggunakan operasi ListBuckets untuk mencantumkan bucket dalam akun Anda.
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 mengirim permintaan sinkron ke kolam thread guna eksekusi konkuren. Pemanggilan ini 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 menggunakan 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;
}Untuk contoh lengkap yang mencakup unggah dan unduh konkuren, lihat AsyncCallOnSyncClient.cpp dan AsyncCallbackOnSyncClient.cpp.
OSSAsyncClient (asinkron)
Mode asinkron native ini menggunakan OSSAsyncClient. Setiap operasi memiliki metode operationNameAsync() 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;
}Setelah menjalankan kode, output akan mencantumkan semua bucket dalam akun Anda di seluruh wilayah.
Konfigurasi klien
Gunakan domain kustom
Titik akhir OSS default mungkin mencegah akses langsung browser untuk pratinjau file. Dengan menggunakan domain kustom untuk mengakses OSS, Anda dapat mengaktifkan pratinjau dan menggunakan CDN untuk pengiriman yang dipercepat.
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
C++ SDK V2 memiliki StandardRetryer bawaan. Secara default, ini menggunakan strategi backoff FullJitterBackoff dengan maksimal 3 kali percobaan ulang. Anda dapat menggunakan retryMaxAttempts untuk mengatur jumlah maksimum percobaan ulang.
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);Untuk contoh lain tentang strategi percobaan ulang kustom, lihat CustomRetryStrategy.cpp.
Protokol HTTP/HTTPS
Protokol HTTPS digunakan secara default. Untuk menggunakan protokol HTTP, setel 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 aplikasi Anda dideploy di ECS, Anda dapat menggunakan titik akhir internal untuk mengakses OSS dan mengurangi 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
Akses OSS melalui titik akhir akselerasi transfer untuk meningkatkan kinerja 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 dengan 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
C++ SDK V2 menggunakan cURL sebagai lapisan transport HTTP secara default. Anda dapat menggantinya dengan implementasi lain menggunakan parameter httpTransport. WinHTTP juga didukung di Windows.
Untuk contoh lapisan transport kustom, lihat CurlCustomConfig.cpp dan WinHttpCustomConfig.cpp.
Konfigurasikan kredensial akses
Sebelum menggunakan OSS C++ SDK V2, Anda harus mengonfigurasi kredensial akses. C++ SDK V2 mendukung metode berikut untuk mengonfigurasi kredensial:
Access key Pengguna RAM
Jika aplikasi Anda berjalan di lingkungan aman dan stabil yang tidak terpapar internet, gunakan access key Pengguna RAM.
Variabel lingkungan (Direkomendasikan)
Dapatkan kredensial dari variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET.
Setel variabel lingkungan menggunakan access key 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'" >> ~/.bashrcJalankan perintah berikut untuk menerapkan perubahan.
source ~/.bashrcJalankan perintah berikut untuk memverifikasi bahwa variabel lingkungan telah disetel.
echo $OSS_ACCESS_KEY_ID echo $OSS_ACCESS_KEY_SECRET
macOS
Di terminal, jalankan perintah berikut untuk memeriksa jenis shell default Anda.
echo $SHELLIkuti 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'" >> ~/.zshrcJalankan perintah berikut untuk menerapkan perubahan.
source ~/.zshrcJalankan perintah berikut untuk memverifikasi bahwa variabel lingkungan telah disetel.
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_profileJalankan perintah berikut untuk menerapkan perubahan.
source ~/.bash_profileJalankan perintah berikut untuk memverifikasi bahwa variabel lingkungan telah disetel.
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 disetel.
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 disetel.
[System.Environment]::GetEnvironmentVariable('OSS_ACCESS_KEY_ID', [System.EnvironmentVariableTarget]::User) [System.Environment]::GetEnvironmentVariable('OSS_ACCESS_KEY_SECRET', [System.EnvironmentVariableTarget]::User)
Setelah memodifikasi variabel lingkungan sistem, mulai ulang lingkungan build dan runtime Anda, seperti IDE dan antarmuka baris perintah, agar perubahan diterapkan.
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 klien untuk melakukan operasi. return 0; }
Secara eksplisit dalam kode
Anda dapat memberikan secara eksplisit ID access key dan secret access key menggunakan StaticCredentialsProvider.
Metode ini mengekspos access key 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 klien untuk melakukan operasi.
return 0;
}Kredensial sementara STS
Jika aplikasi Anda memerlukan akses sementara ke OSS, Anda dapat menggunakan kredensial sementara STS, yang mencakup ID access key, secret access key, dan token keamanan. Anda harus mengelola dan menyegarkan token STS ini secara manual, yang dapat menambah kompleksitas dan risiko keamanan.
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 access key yang diperoleh dari STS diawali dengan prefiks
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.
Setel 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 klien untuk melakukan operasi. return 0; }
Secara eksplisit dalam kode
Anda dapat memberikan secara eksplisit ID access key sementara, secret access key, dan token keamanan menggunakan StaticCredentialsProvider.
Jangan menyematkan kredensial sementara dalam aplikasi produksi Anda. Metode ini hanya untuk tujuan pengujian. Di lingkungan produksi, kami menyarankan menggunakan variabel lingkungan atau metode SDK yang secara otomatis menyegarkan token STS.
#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 klien untuk melakukan operasi.
return 0;
}RAMRoleARN, ECSRAMRole, atau OIDCRoleARN
Untuk metode kredensial seperti RAMRoleARN, ECSRAMRole, dan OIDCRoleARN, kami menyarankan menggunakan pustaka alibabacloud-credentials-cpp dengan CredentialsProviderFunc.
Instal dependensi.
vcpkg install alibabacloud-credentials-cppTambahkan 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 access key Pengguna RAM. Untuk menghindari hardcoding, kami menyarankan menyuntikkan nilai ini melalui variabel lingkungan ALIBABA_CLOUD_ACCESS_KEY_ID. credConfig->accessKeyId = std::make_shared<std::string>("YOUR_ACCESS_KEY_ID"); // Secret access key Pengguna RAM. Untuk menghindari hardcoding, kami menyarankan 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 klien 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 klien 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"); // Path ke file token OIDC, yang secara otomatis dimount ke dalam 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 klien untuk melakukan operasi. return 0; }Untuk contoh kredensial lainnya, lihat contoh kredensial.
Akses anonim
Jika bucket dan objek yang ingin Anda akses memiliki izin baca-publik, Anda dapat menggunakan akses anonim.
#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 klien untuk melakukan operasi.
return 0;
}Penyedia kredensial kustom
Jika metode kredensial di atas tidak memenuhi kebutuhan Anda, Anda dapat menyesuaikan logika pengambilan kredensial menggunakan 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 klien untuk melakukan operasi.
return 0;
}Memanggil operasi API
Operasi API di OSS C++ SDK V2 mengikuti konvensi penamaan dan pola pemanggilan yang konsisten. Bagian ini menjelaskan penamaan API, mode pemanggilan, pembatalan permintaan, dan penanganan error.
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 berdurasi panjang 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 menyetel timeout. SDK secara otomatis membatalkan permintaan saat timeout habis.
// Atur timeout 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 gagal, ambil objek error dengan 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;
}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
OSS C++ SDK V2 menyediakan banyak kode contoh untuk membantu Anda memulai dengan cepat.
Kategori | Deskripsi | Versi sinkron | Versi asinkron |
Bucket | Buat bucket | ||
Daftar bucket | |||
Hapus bucket | |||
Dapatkan informasi bucket | |||
Dapatkan lokasi bucket | |||
Unggah objek | Unggah sederhana | ||
Unggah append | |||
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 | Atur penandaan objek | ||
Dapatkan penandaan objek | |||
Hapus penandaan objek | |||
Kontrol akses | Atur ACL bucket | ||
Dapatkan ACL bucket | |||
Atur ACL objek | |||
Pengendalian versi | Atur pengendalian versi bucket | ||
Dapatkan status pengendalian versi bucket | |||
Daftar versi objek | |||
Perlindungan hotlink | Atur 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 | - | |
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 | - | ||
Contoh skenario lainnya | - |