Todos os produtos
Search
Central de documentação

Object Storage Service:OSS C++ SDK V2

Última atualização: Aug 03, 2026

Use o OSS C++ SDK V2 para fazer upload, baixe e gerencie objetos no Alibaba Cloud OSS a partir de aplicações C++. Este SDK foi desenvolvido para cenários de alta performance, sistemas embarcados e aplicações desktop.

Nota

O OSS C++ SDK V2 está em fase de preview. As interfaces podem sofrer alterações. Consulte as notas de versão no repositório do GitHub para obter atualizações.

GitHub | código de exemplo | guia de migração | deepwiki

Início rápido

Siga as etapas abaixo para instale o SDK, configure credenciais e inicializar um client.

Pré-requisitos

  • Um compilador compatível com C++17 ou superior (GCC 7+, Clang 5+ ou MSVC 2017+).

  • CMake 3.15 ou superior.

Execute o comando cmake --version para verifique sua versão do CMake. Caso o CMake não esteja instalado ou a versão seja anterior à 3.15, baixe e instale o CMake .

Instale o SDK

Recomendamos o uso do vcpkg como método de instalação.

vcpkg

Use o gerenciador de pacotes vcpkg para instale o 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]

Também é possível instale a partir do código-fonte usando uma 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
Nota

Especifique uma camada de transporte http (curl ou winhttp), pois nenhuma vem ativada por padrão. Você pode ative ambas se desejar.

Se tanto openssl quanto mbedtls estiverem ativados, o openssl terá precedência.

Recursos opcionais:

Recurso

Descrição

curl

Camada de transporte http baseada em libcurl. Especifique explicitamente [curl] no comando de instalação, já que este recurso não vem ativado por padrão.

winhttp

Camada de transporte http baseada em WinHTTP (apenas Windows).

openssl

Usa OpenSSL para cálculo de hash.

mbedtls

Usa mbedTLS para cálculo de hash.

encryption

Ativa criptografia no lado do cliente. Em plataformas não-Windows, ative também openssl ou mbedtls.

rtti

Habilita informações de tipo em tempo de execução (RTTI) durante a compilação.

tinyxml2

Usa a biblioteca tinyxml2 instalada no sistema em vez da versão incluída no sdk.

Definições completas: vcpkg/vcpkg.json.

Código-fonte

Baixe a versão mais recente do OSS C++ SDK V2 no GitHub e, em seguida, compile e instale com o 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

Opções disponíveis no CMake:

BUILD_SHARED_LIBS

Compila o sdk como uma biblioteca compartilhada. Por padrão, gera uma biblioteca estática (OFF).

USE_CURL_TRANSPORT

Usa libcurl como camada de transporte http.

USE_WINHTTP_TRANSPORT

Usa WinHTTP como camada de transporte http (apenas Windows).

USE_SYSTEM_CURL

Usa a libcurl instalada no sistema em vez da versão incluída no sdk.

USE_SYSTEM_OPENSSL

Usa o OpenSSL instalado no sistema.

USE_SYSTEM_MBEDTLS

Usa o mbedTLS instalado no sistema.

USE_SYSTEM_TINYXML2

Usa o tinyxml2 instalado no sistema.

USE_STD_EXPECTED

Usa std::expected do padrão C++23. Por padrão, usa a implementação compatível incluída no sdk.

ENABLE_ENCRYPTION

Ativa a criptografia no lado do cliente.

ENABLE_RTTI

Habilita informações de tipo em tempo de execução (RTTI).

Adicione a dependência ao arquivo CMakeLists.txt do seu projeto:

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)

Configure credenciais de acesso

Defina variáveis de ambiente com o par de AccessKey do seu usuário RAM.

No RAM console , crie um usuário RAM e gere uma AccessKey permanente . Salve a AccessKey e, em seguida, conceda a permissão AliyunOSSFullAccess ao usuário.

Linux

  1. Na interface de linha de comando, execute os comandos abaixo para adicionar as variáveis de ambiente ao seu arquivo ~/.bashrc.

    echo "export OSS_ACCESS_KEY_ID='YOUR_ACCESS_KEY_ID'" >> ~/.bashrc
    echo "export OSS_ACCESS_KEY_SECRET='YOUR_ACCESS_KEY_SECRET'" >> ~/.bashrc
    1. Execute o seguinte comando para aplicar as alterações.

      source ~/.bashrc
    2. Execute os comandos a seguir para verifique se as variáveis de ambiente foram definidas corretamente.

      echo $OSS_ACCESS_KEY_ID
      echo $OSS_ACCESS_KEY_SECRET

macOS

  1. No terminal, execute o comando abaixo para identificar seu shell padrão.

    echo $SHELL
    1. As próximas etapas dependem do seu shell padrão.

      Zsh

      1. Execute os comandos a seguir para adicionar as variáveis de ambiente ao seu arquivo ~/.zshrc.

        echo "export OSS_ACCESS_KEY_ID='YOUR_ACCESS_KEY_ID'" >> ~/.zshrc
        echo "export OSS_ACCESS_KEY_SECRET='YOUR_ACCESS_KEY_SECRET'" >> ~/.zshrc
      2. Aplique as alterações executando o comando abaixo.

        source ~/.zshrc
      3. Verifique se as variáveis de ambiente estão configuradas executando estes comandos.

        echo $OSS_ACCESS_KEY_ID
        echo $OSS_ACCESS_KEY_SECRET

      Bash

      1. Adicione as variáveis de ambiente ao seu arquivo ~/.bash_profile executando os comandos abaixo.

        echo "export OSS_ACCESS_KEY_ID='YOUR_ACCESS_KEY_ID'" >> ~/.bash_profile
        echo "export OSS_ACCESS_KEY_SECRET='YOUR_ACCESS_KEY_SECRET'" >> ~/.bash_profile
      2. Para aplicar as mudanças, execute o seguinte comando.

        source ~/.bash_profile
      3. Confirme a configuração das variáveis de ambiente com os comandos a seguir.

        echo $OSS_ACCESS_KEY_ID
        echo $OSS_ACCESS_KEY_SECRET

Windows

Command Prompt

  1. No Prompt de Comando (CMD), execute os comandos abaixo:

    setx OSS_ACCESS_KEY_ID "YOUR_ACCESS_KEY_ID"
    setx OSS_ACCESS_KEY_SECRET "YOUR_ACCESS_KEY_SECRET"
  2. Abra novamente o Prompt de Comando e execute os seguintes comandos para validar as variáveis de ambiente.

    echo %OSS_ACCESS_KEY_ID%
    echo %OSS_ACCESS_KEY_SECRET%

PowerShell

  1. No PowerShell, execute os comandos a seguir.

    [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)
  2. Reabra o PowerShell e verifique se as variáveis foram definidas corretamente usando estes comandos.

    [System.Environment]::GetEnvironmentVariable('OSS_ACCESS_KEY_ID', [System.EnvironmentVariableTarget]::User)
    [System.Environment]::GetEnvironmentVariable('OSS_ACCESS_KEY_SECRET', [System.EnvironmentVariableTarget]::User)

Inicializar o client

O sdk oferece suporte a três modos de requisição: OSSClient (síncrono), OSSClient (assíncrono) (baseado em pool de threads) e OSSAsyncClient (assíncrono) (async nativo). Os exemplos a seguir usam ListBuckets para demonstrar cada modo.

OSSClient (síncrono)

Use o modo síncrono do OSSClient quando precisar aguardar a conclusão de uma operação antes de prosseguir.

Antes de execute o código de exemplo, substitua <region-id> por um region and endpoint real, como ap-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 (assíncrono)

Este modo assíncrono baseado em pool de threads ainda usa o OSSClient. Após defina conf.executor (um pool de threads), chame asyncCall() para despachar uma requisição síncrona ao pool para execução concorrente. A chamada retorna um std::future, e o chamador aguarda o resultado com get().

Se conf.executor não estiver definido, asyncCall() retornará um erro NoExecutor .
#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;
}

Exemplos de upload e download concorrentes: AsyncCallOnSyncClient.cpp e AsyncCallbackOnSyncClient.cpp.

OSSAsyncClient (assíncrono)

Este modo assíncrono nativo usa o OSSAsyncClient. Cada operação possui um método correspondente operationNameAsync() que recebe o resultado por meio de callback, eliminando a necessidade de configure um pool de threads. Este modo é ideal para cenários que exigem alto volume de operações concorrentes.

Antes de execute o código de exemplo, substitua <region-id> por um region and endpoint real, como ap-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;
}

A saída lista todos os buckets da sua conta em todas as regiões.

Configuração do client

Parâmetros suportados pelo client

Parâmetro

Descrição

region

(Obrigatório) A região para onde as requisições serão enviadas.

credentialsProvider

(Obrigatório) O provedor de credenciais de acesso.

endpoint

O endpoint do service.

httpTransport

Define o cliente http. Padrão: curl.

retryMaxAttempts

Número máximo de tentativas para uma requisição http. Padrão: 3.

retryer

Manipulador de novas tentativas para requisições http. Padrão: StandardRetryer com estratégia de backoff FullJitterBackoff.

connectTimeout

Tempo limite de conexão em milissegundos. Padrão: 5000.

readWriteTimeout

Tempo limite de transferência de dados em milissegundos. Padrão: 20000.

insecureSkipVerify

Ignora a verificação de certificado SSL. Padrão: false (verificação ativada).

enabledRedirect

Habilita redirecionamento http. Padrão: false.

signatureVersion

Versão da assinatura. Padrão: v4. Requer que o parâmetro region esteja definido.

signer

Implementação personalizada de assinador. Substitui signatureVersion se definido.

disableSsl

Desativa HTTPS e usa http. Padrão: false (HTTPS é usado).

usePathStyle

Usa requisições no estilo path-style. Padrão: false (virtual-hosted style é usado).

useCName

Usa um domínio personalizado. Padrão: false.

useDualStackEndpoint

Usa um endpoint dual-stack. Padrão: false.

useAccelerateEndpoint

Usa um endpoint de aceleração de transferência. Padrão: false.

useInternalEndpoint

Usa um endpoint interno. Padrão: false.

additionalHeaders

Headers adicionais a serem incluídos na assinatura v4.

userAgent

Informações adicionais para anexar ao header User-Agent.

disableClockSkewCorrection

Desativa a correção automática de dessincronização de relógio. Padrão: false (correção ativada).

disableAutoDetectMimeType

Desativa a detecção automática de Content-Type baseada na chave do objeto. Padrão: false (detecção ativada).

disableUploadCRC64Check

Desativa a verificação CRC64 para requisições de upload (PutObject, AppendObject, UploadPart e Uploader). Padrão: false (verificação ativada).

disableDownloadCRC64Check

Desativa a verificação CRC64 para requisições de download (GetObjectToFile e Downloader.DownloadFile). Padrão: false (verificação ativada).

executor

Implementação de pool de threads para operações assíncronas no OSSClient, como asyncCall e asyncCallback. Se este parâmetro não for definido, chamar asyncCall retornará um erro NoExecutor.

asyncHttpTransport

Camada de transporte http assíncrona para OSSAsyncClient. Padrão: CurlMultiTransport.

scheduledExecutor

Agendador interno de tarefas para OSSAsyncClient. O sdk usa sua implementação integrada por padrão.

Usar um domínio personalizado

Um custom domain permite visualização de arquivos via navegador e entrega acelerada por cdn.

Antes de execute o código de exemplo, substitua <region-id> por um id de região real da lista region and endpoint , como ap-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;
}

Controle de timeout

Use connectTimeout e readWriteTimeout para configure os tempos limite de conexão e leitura/gravação em milissegundos.

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);

Política de nova tentativa

O StandardRetryer integrado usa uma estratégia FullJitterBackoff com no máximo 3 tentativas por padrão. Use retryMaxAttempts para ajustar esse valor.

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);

Exemplo de estratégia de nova tentativa personalizada: CustomRetryStrategy.cpp.

Protocolo http/HTTPS

O protocolo HTTPS é usado por padrão. Para usar o protocolo http, defina disableSsl como 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);

Usar um endpoint interno

Ao implantar no ECS, use um endpoint interno para evitar custos de tráfego de rede pública.

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);

Usar um endpoint de aceleração de transferência

Use um endpoint de aceleração de transferência para transferências de dados de longa distância.

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);

Usar um domínio personalizado (CNAME)

Acesse o OSS usando um domínio personalizado (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);

Personalizar o transporte http

O sdk usa curl por padrão. Substitua-o via httpTransport. O WinHTTP também é suportado no Windows.

Exemplos de transporte personalizado: CurlCustomConfig.cpp e WinHttpCustomConfig.cpp.

Configure credenciais de acesso

O sdk suporta os seguintes métodos de credencial:

Como escolha um método de credencial

Método de credencial

Casos de uso

Requer credenciais existentes

Tipo de credencial

Validade da credencial

Rotação ou atualização

Usar access key de usuário RAM

Adequado para aplicações executadas em ambiente seguro e estável, não exposto a ataques externos, que requerem acesso de longo prazo aos services cloud sem rotação frequente de credenciais.

Sim

Access key

Longo prazo

Rotação manual

Usar credencial temporária STS

Recomendado para aplicações em ambientes não confiáveis que necessitam de controle sobre validade e permissões de acesso.

Sim

Token STS

Temporário

Atualização manual

Usar RAMRoleARN

Projetado para aplicações que precisam de acesso delegado aos services cloud, como acessar recursos entre diferentes contas Alibaba Cloud.

Sim

Token STS

Temporário

Atualização automática

Usar ECSRAMRole

Mais indicado para aplicações implantadas em instâncias ECS, instâncias ECI ou nós worker no Container Service for Kubernetes (ACK) da Alibaba Cloud.

Não

Token STS

Temporário

Atualização automática

Usar OIDCRoleARN

Ideal para aplicações não confiáveis implantadas em nós worker no Container Service for Kubernetes (ACK).

Não

Token STS

Temporário

Atualização automática

Usar acesso anônimo

Destinado ao acesso de recursos OSS com leitura pública.

Não

Nenhum

-

-

Usar credencial personalizada

Caso nenhum dos métodos anteriores atenda aos seus requisitos, implemente um provedor de credenciais personalizado.

Personalizado

Personalizado

Personalizado

Personalizado

Access key de usuário RAM

Use a access key de um usuário RAM para aplicações em ambientes seguros e não expostos à internet.

Variáveis de ambiente (Recomendado)

Obtenha as credenciais das variáveis de ambiente OSS_ACCESS_KEY_ID e OSS_ACCESS_KEY_SECRET.

  1. Defina as variáveis de ambiente usando a access key de um usuário RAM.

    Linux

    1. Na linha de comando, execute os comandos abaixo para anexar as definições das variáveis de ambiente ao arquivo ~/.bashrc.

      echo "export OSS_ACCESS_KEY_ID='YOUR_ACCESS_KEY_ID'" >> ~/.bashrc
      echo "export OSS_ACCESS_KEY_SECRET='YOUR_ACCESS_KEY_SECRET'" >> ~/.bashrc
    2. Execute o seguinte comando para aplicar as alterações.

      source ~/.bashrc
    3. Verifique se as variáveis de ambiente foram definidas executando os comandos a seguir.

      echo $OSS_ACCESS_KEY_ID
      echo $OSS_ACCESS_KEY_SECRET

    macOS

    1. No terminal, execute o comando abaixo para verifique o tipo do seu shell padrão.

      echo $SHELL
    2. Siga as etapas correspondentes ao seu shell padrão.

      Zsh

      1. Anexe as configurações de variáveis de ambiente ao arquivo ~/.zshrc executando estes comandos.

        echo "export OSS_ACCESS_KEY_ID='YOUR_ACCESS_KEY_ID'" >> ~/.zshrc
        echo "export OSS_ACCESS_KEY_SECRET='YOUR_ACCESS_KEY_SECRET'" >> ~/.zshrc
      2. Aplique as mudanças com o comando abaixo.

        source ~/.zshrc
      3. Valide a configuração das variáveis de ambiente executando os comandos seguintes.

        echo $OSS_ACCESS_KEY_ID
        echo $OSS_ACCESS_KEY_SECRET

      Bash

      1. Adicione as definições de variáveis de ambiente ao arquivo ~/.bash_profile usando os comandos abaixo.

        echo "export OSS_ACCESS_KEY_ID='YOUR_ACCESS_KEY_ID'" >> ~/.bash_profile
        echo "export OSS_ACCESS_KEY_SECRET='YOUR_ACCESS_KEY_SECRET'" >> ~/.bash_profile
      2. Para efetivar as alterações, execute o seguinte comando.

        source ~/.bash_profile
      3. Confirme se as variáveis de ambiente estão definidas com estes comandos.

        echo $OSS_ACCESS_KEY_ID
        echo $OSS_ACCESS_KEY_SECRET

    Windows

    CMD

    1. No CMD, execute os comandos a seguir.

      setx OSS_ACCESS_KEY_ID "YOUR_ACCESS_KEY_ID"
      setx OSS_ACCESS_KEY_SECRET "YOUR_ACCESS_KEY_SECRET"
    2. Reabra o CMD e valide as variáveis de ambiente executando estes comandos.

      echo %OSS_ACCESS_KEY_ID%
      echo %OSS_ACCESS_KEY_SECRET%

    PowerShell

    1. No PowerShell, execute os comandos abaixo.

      [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)
    2. Abra novamente o PowerShell e verifique as variáveis de ambiente com os seguintes comandos.

      [System.Environment]::GetEnvironmentVariable('OSS_ACCESS_KEY_ID', [System.EnvironmentVariableTarget]::User)
      [System.Environment]::GetEnvironmentVariable('OSS_ACCESS_KEY_SECRET', [System.EnvironmentVariableTarget]::User)
  2. Após modificar variáveis de ambiente do sistema, reinicie sua IDE e o terminal para que as alterações tenham efeito.

  3. Use as variáveis de ambiente para passar as credenciais.

    Antes de execute o código de exemplo, substitua <region-id> por um id de região real, como cn-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;
    }

Explicitamente no código

Forneça explicitamente o id e o segredo da access key usando StaticCredentialsProvider.

Aviso

Este método expõe sua access key no código e é recomendado apenas para fins de teste. Em ambientes de produção, use um método mais seguro, como variáveis de ambiente.

#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;
}

Credencial temporária STS

Credenciais temporárias STS consistem em um id de access key, segredo da access key e token de segurança. Gerencie e atualize o token manualmente.

Nota
  • Para obter uma credencial temporária STS usando um sdk, consulte Use STS temporary credentials to access OSS.

  • Ao gerar um token STS, especifique um tempo de expiração. O token torna-se inválido automaticamente após esse período.

  • Observe que os IDs de access key obtidos via STS começam com o prefixo STS, por exemplo, STS.L4aBSCSJVMuKg5U1****.

Variáveis de ambiente (Recomendado)

Obtenha credenciais temporárias através das variáveis de ambiente OSS_ACCESS_KEY_ID, OSS_ACCESS_KEY_SECRET e OSS_SESSION_TOKEN.

  1. Defina as variáveis de ambiente usando as credenciais temporárias.

    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>
  2. Passe as credenciais usando as variáveis de ambiente. O EnvironmentVariableCredentialsProvider do sdk lê automaticamente essas três variáveis.

    Antes de execute o código de exemplo, substitua <region-id> por um id de região real, como cn-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;
    }

Explicitamente no código

Forneça explicitamente o id da access key temporária, o segredo e o token de segurança usando StaticCredentialsProvider.

Aviso

Apenas para testes. Não incorpore credenciais em código de produção. Use variáveis de ambiente ou um método do sdk com atualização automática.

#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

Para métodos de credencial como RAMRoleARN, ECSRAMRole e OIDCRoleARN, recomendamos o uso da biblioteca alibabacloud-credentials-cpp com CredentialsProviderFunc.

  1. Instale a dependência.

    vcpkg install alibabacloud-credentials-cpp
  2. Adicione a dependência no seu arquivo CMakeLists.txt.

    find_package(alibabacloud_credentials REQUIRED)
  3. Integre a biblioteca usando 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;
    }

    Mais exemplos de credenciais: exemplos de credenciais.

Acesso anônimo

Acesse buckets e objetos com leitura pública sem necessidade de credenciais.

#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;
}

Provedor de credenciais personalizado

Implemente lógica personalizada de obtenção de credenciais com 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;
}

Chamada de operações de API

As operações de API seguem uma convenção de nomenclatura e padrão de chamada consistentes.

Convenção de nomenclatura de API

Os nomes dos métodos usam o estilo camelCase. Cada operação recebe um parâmetro <OperationName>Request e retorna um <OperationName>Outcome (Outcome<Result, Error>).

OSSClient (síncrono):

OutcomeType operationName(const models::OperationNameRequest& request, const OperationOptions* options = nullptr)

OSSAsyncClient (assíncrono nativo):

void operationNameAsync(const models::OperationNameRequest& request, const OperationNameAsyncCallback& callback, const OperationOptions* options = nullptr)

Modos de chamada

Modo de chamada

OSSClient

OSSAsyncClient

síncrono

operationName(request)

-

assíncrono baseado em future

asyncCall(request) (requer configuração de conf.executor)

asyncCall(request)

assíncrono baseado em callback

asyncCallback(request, cb) (requer configuração de conf.executor)

operationNameAsync(request, cb)

Cancele uma requisição

Para cancele operações longas com um CancellationToken, passe um cancellationToken em OperationOptions. O OSS C++ SDK V2 oferece dois modos de cancelamento:

Cancelar imediatamente

Chame CancellationTokenSource::cancel() a partir de outra thread para interromper uma requisição em andamento.

// 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();

Cancelar por prazo limite

Chame cancelAfter() para defina um tempo limite. O sdk cancela automaticamente a requisição quando o tempo expira.

// 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);

Tratamento de erros

O OSS C++ SDK V2 usa Outcome<Result, Error>, compatível com std::expected. Chame has_value() para verifique o sucesso. Em caso de sucesso, recupere o resultado com value() ou desreferenciando o objeto outcome (*outcome). Caso contrário, obtenha o objeto de erro com 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;
}

Ao compilar com a flag -DUSE_STD_EXPECTED=ON (C++23), Outcome torna-se um alias de tipo para std::expected, suportando operações monádicas como .and_then(), .transform() e .or_else().

Código de exemplo

A tabela a seguir lista os códigos de exemplo disponíveis.

Categoria

Descrição

Versão síncrona

Versão assíncrona

Buckets

Crie um bucket

PutBucket.cpp

PutBucket.cpp

Listar buckets

ListBuckets.cpp

ListBuckets.cpp

Exclua um bucket

DeleteBucket.cpp

DeleteBucket.cpp

Obter informações do bucket

GetBucketInfo.cpp

GetBucketInfo.cpp

Obter localização do bucket

GetBucketLocation.cpp

GetBucketLocation.cpp

Upload de objeto

Upload simples

PutObject.cpp

PutObject.cpp

Upload por append

AppendObject.cpp

AppendObject.cpp

Upload multipart

UploadPart.cpp

UploadPart.cpp

Cópia multipart

UploadPartCopy.cpp

UploadPartCopy.cpp

Download de objeto

Download simples

GetObject.cpp

GetObject.cpp

Copiar um objeto

CopyObject.cpp

CopyObject.cpp

Gerenciamento de objetos

Listar objetos

ListObjects.cpp

ListObjects.cpp

Listar objetos V2

ListObjectsV2.cpp

ListObjectsV2.cpp

Exclua um objeto

DeleteObject.cpp

DeleteObject.cpp

Exclua múltiplos objetos

DeleteMultipleObjects.cpp

DeleteMultipleObjects.cpp

Obter metadados do objeto

HeadObject.cpp

HeadObject.cpp

Obter metadados simplificados do objeto

GetObjectMeta.cpp

GetObjectMeta.cpp

Objetos arquivados

Restaurar um objeto

RestoreObject.cpp

RestoreObject.cpp

Exclua um objeto restaurado

CleanRestoredObject.cpp

CleanRestoredObject.cpp

Links simbólicos

Crie um link simbólico

PutSymlink.cpp

PutSymlink.cpp

Obter um link simbólico

GetSymlink.cpp

GetSymlink.cpp

Tagging de objetos

Defina tagging de objeto

PutObjectTagging.cpp

PutObjectTagging.cpp

Obter tagging de objeto

GetObjectTagging.cpp

GetObjectTagging.cpp

Exclua tagging de objeto

DeleteObjectTagging.cpp

DeleteObjectTagging.cpp

Controle de acesso

Defina ACL do bucket

PutBucketAcl.cpp

PutBucketAcl.cpp

Obter ACL do bucket

GetBucketAcl.cpp

GetBucketAcl.cpp

Defina ACL do objeto

PutObjectAcl.cpp

PutObjectAcl.cpp

Versionamento

Defina versionamento do bucket

PutBucketVersioning.cpp

PutBucketVersioning.cpp

Obter status de versionamento do bucket

GetBucketVersioning.cpp

GetBucketVersioning.cpp

Listar versões de objetos

ListObjectVersions.cpp

ListObjectVersions.cpp

Proteção contra hotlink

Defina proteção contra hotlink

PutBucketReferer.cpp

PutBucketReferer.cpp

Obter configuração de proteção contra hotlink

GetBucketReferer.cpp

GetBucketReferer.cpp

Funções do sistema

Consultar informações de endpoint

DescribeRegions.cpp

DescribeRegions.cpp

url pré-assinada

Gerar url pré-assinada para download

PresignGetObject.cpp

-

Gerar url pré-assinada para upload

PresignPutObject.cpp

-

Gerar url pré-assinada para requisição HEAD

PresignHeadObject.cpp

-

Gerar url pré-assinada para upload multipart

PresignUploadPart.cpp

-

API genérica

Usando invokeOperation

InvokeOperation.cpp

-

Processamento de dados

Processar um objeto e salve o resultado

ProcessObject.cpp

ProcessObject.cpp

Envie tarefa assíncrona de processamento de objeto

AsyncProcessObject.cpp

AsyncProcessObject.cpp

Paginador

Listar todos os buckets

ListBucketsPaginator.cpp

-

Listar todos os objetos (recomendado)

ListObjectsV2Paginator.cpp

-

Listar todas as versões de objetos

ListObjectVersionsPaginator.cpp

-

Listar todas as partes carregadas

ListPartsPaginator.cpp

-

Listar todos os uploads multipart

ListMultipartUploadsPaginator.cpp

-

Listar todos os objetos (legado, não recomendado)

ListObjectsPaginator.cpp

-

Exemplos de cenários

Série SinkFactory (download zero-copy, upload resumível e verificação CRC)

samples/scenario/sink-factory

-

Operações assíncronas com future/callback

samples/scenario/sync-client-async

-

Mais exemplos de cenários

samples/scenario

-