OSSClientは、バケットやオブジェクトなどのObject Storage Service (OSS) リソースを管理するために使用されます。 OSS SDK for C ++ を使用してリクエストを開始するには、OSSClientインスタンスを初期化し、ClientConfigurationのデフォルト設定項目を変更する必要があります。
OSSClientインスタンスの作成
OSSClientはスレッドセーフで、複数のスレッドを使用して同じインスタンスにアクセスできます。 OSSClientインスタンスを再利用するか、ビジネス要件に基づいて複数のOSSClientインスタンスを作成できます。
InitializeSdk() とShutdownSdk() は、プログラムのライフサイクル中に一度だけ呼び出す必要があるグローバル操作です。
V1署名アルゴリズムの使用
OSSエンドポイントの使用
#include <alibabacloud/oss/OssClient.h>
名前空間listaCloud::OSSを使用します。int main(void)
{
/* OSSへのアクセスに使用されるアカウントに関する情報を初期化します。 */
/* バケットが配置されているリージョンのエンドポイントを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。 */
std::string Endpoint = "yourEndpoint";
/* ネットワークリソースなどのリソースを初期化します。 */
InitializeSdk();
ClientConfiguration conf;
/* 環境変数からアクセス資格情報を取得します。 サンプルコードを実行する前に、OSS_ACCESS_KEY_IDおよびOSS_ACCESS_KEY_SECRET環境変数が設定されていることを確認してください。 */
auto credentialsProvider = std::make_shared<EnvironmentVariableCredentialsProvider>();
OssClientクライアント (Endpoint, credentialsProvider, conf);
/* ネットワークリソースなどのリソースをリリースします。 */
ShutdownSdk();
0を返します。}
カスタムドメイン名の使用
#include <alibabacloud/oss/OssClient.h>
名前空間listaCloud::OSSを使用します。int main(void)
{
/* OSSへのアクセスに使用されるアカウントに関する情報を初期化します。 */
/* yourEndpointを使用するカスタムドメイン名に設定します。 */
std::string Endpoint = "yourEndpoint";
/* ネットワークリソースなどのリソースを初期化します。 */
InitializeSdk();
ClientConfiguration conf;
conf.isCname = true;
/* 環境変数からアクセス資格情報を取得します。 サンプルコードを実行する前に、OSS_ACCESS_KEY_IDおよびOSS_ACCESS_KEY_SECRET環境変数が設定されていることを確認してください。 */
auto credentialsProvider = std::make_shared<EnvironmentVariableCredentialsProvider>();
OssClientクライアント (Endpoint, credentialsProvider, conf);
/* ネットワークリソースなどのリソースをリリースします。 */
ShutdownSdk();
0を返します。}
STSから取得した一時的なアクセス資格情報の使用
Security Token Service (STS) によって提供される一時的なアクセス資格情報には、セキュリティトークンと一時的なAccessKeyペアが含まれます。 AccessKeyペアは、AccessKey IDとAccessKeyシークレットで構成されます。 STSから一時的なアクセス資格情報を取得する方法の詳細については、「STSが提供する一時的な資格情報を使用してOSSにアクセスする」をご参照ください。
#include <alibabacloud/oss/OssClient.h>
名前空間listaCloud::OSSを使用します。int main(void)
{
/* バケットが配置されているリージョンのエンドポイントを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。 */
std::string Endpoint = "yourEndpoint";
/* ネットワークリソースなどのリソースを初期化します。 */
InitializeSdk();
ClientConfiguration conf;
/* 環境変数からアクセス資格情報を取得します。 サンプルコードを実行する前に、一時的なAccessKeyペアとセキュリティトークンが環境変数を使用して設定されていることを確認してください。 */
auto credentialsProvider = std::make_shared<EnvironmentVariableCredentialsProvider>();
OssClientクライアント (Endpoint, credentialsProvider, conf);
/* ネットワークリソースなどのリソースをリリースします。 */
ShutdownSdk();
0を返します。}
V4署名アルゴリズムの使用 (推奨)
V4署名アルゴリズムは、より良好なセキュリティを提供する。 V4署名アルゴリズムを使用してOSSClientインスタンスを作成する場合は、regionとsignatureVersionの2つのパラメーターを追加します。 aliyun-oss-cpp-sdk V1.10.0はV4署名アルゴリズムをサポートしています。
次のサンプルコードは、OSSエンドポイントとV4署名アルゴリズムを使用してOSSClientインスタンスを作成する方法の例を示しています。 STSから取得したカスタムドメイン名またはアクセス資格情報を使用してOSSClientインスタンスを作成するには、次のサンプルコードを変更します。
#include <alibabacloud/oss/OssClient.h>
名前空間listaCloud::OSSを使用します。int main(void)
{
/* OSSへのアクセスに使用されるアカウントに関する情報を初期化します。 */
/* バケットが配置されているリージョンのエンドポイントを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。 */
std::string Endpoint = "yourEndpoint";
/* バケットが配置されているリージョンを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、リージョンをcn-Hangzhouに設定します。 */
std::string Region = "yourRegion";
/* ネットワークリソースなどのリソースを初期化します。 */
InitializeSdk();
ClientConfiguration conf;
conf.signatureVersion = SignatureVersionType::V4;
/* 環境変数からアクセス資格情報を取得します。 サンプルコードを実行する前に、OSS_ACCESS_KEY_IDおよびOSS_ACCESS_KEY_SECRET環境変数が設定されていることを確認してください。 */
auto credentialsProvider = std::make_shared<EnvironmentVariableCredentialsProvider>();
OssClientクライアント (Endpoint, credentialsProvider, conf);
client.SetRegion (リージョン);
/* ネットワークリソースなどのリソースをリリースします。 */
ShutdownSdk();
0を返します。}
OSSClientインスタンスの設定
ClientConfiguration は OSSClient の設定クラスです。 ClientConfigurationを使用して、userAgent、connectTimeoutMs、maxConnectionsなどのパラメーターを設定できます。
OSSClientを使用してパラメーターを設定できます。 下表に、各パラメーターを説明します。
パラメーター | 説明 |
isCname | CNAMEをエンドポイントとして使用するかどうかを指定します。 デフォルトでは、CNAMEは使用されません。 |
userAgent | ユーザーエージェント (user-agentヘッダー) 。 デフォルト値: aliyun-sdk-cpp/1.X. X |
maxConnections | 接続の最大数。 デフォルト値: 16。 |
requestTimeoutMs | リクエストのタイムアウト期間。 タイムアウト期間を通じてデータが受信されない場合、接続は閉じられます。 デフォルト値: 10000。 単位:ミリ秒。 |
connectTimeoutMs | 接続セットアップのタイムアウト時間。 デフォルト値: 5000。 単位:ミリ秒。 |
retryStrategy | リクエストが失敗した場合に許可される再試行の最大数。 |
proxyScheme | プロキシプロトコル。 デフォルト値: HTTP。 |
proxyPort | プロキシサーバーへの接続に使用されるポート。 |
proxyPassword | プロキシサーバーへのログインに使用されるパスワード。 |
proxyUserName | プロキシサーバーへのログオンに使用されるユーザー名。 |
verifySSL | SSLベースの認証を有効にするかどうかを指定します。 デフォルトでは、SSLベースの認証は無効になっています。 説明 デフォルトでは、SSLベースの認証はOSS SDK for C ++ 1.8.2以降で有効になっています。 |
caPath | CA証明書のルートパス。 このパラメーターは、verifySSLがtrueに設定されている場合に有効です。 デフォルトでは、このパラメータは空のままです。 |
caFile | CA証明書のパス。 このパラメーターは、verifySSLがtrueに設定されている場合に有効です。 デフォルトでは、このパラメータは空のままです。 |
enableCrc64 | CRC-64を有効にするかどうかを指定します。 デフォルトでは、CRC-64は有効です。 |
enableDateSkewAdjustment | HTTPリクエスト時間の自動修正を有効にするかどうかを指定します。 デフォルトでは、HTTPリクエスト時間の自動修正が有効になっています。 |
sendRateLimiter | 最大アップロード速度。 単位: KB/s。 |
recvRateLimiter | 最大ダウンロード速度。 単位: KB/s。 |
タイムアウト期間の設定
次のコードは、タイムアウト期間を設定する方法の例を示しています。
#include <alibabacloud/oss/OssClient.h>
名前空間listaCloud::OSSを使用します。int main(void)
{
/* OSSへのアクセスに使用されるアカウントに関する情報を初期化します。 */
/* バケットが配置されているリージョンのエンドポイントを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。 */
std::string Endpoint = "yourEndpoint";
/* ネットワークリソースなどのリソースを初期化します。 */
InitializeSdk();
ClientConfiguration conf;
/* 接続の最大数を指定します。 デフォルト値: 16。 */
conf.maxConnections = 20;
/* リクエストのタイムアウト時間を指定します。 タイムアウト期間中にデータが受信されない場合、接続は閉じられます。 単位:ミリ秒。 デフォルト値: 10000。 */
conf.requestTimeoutMs = 8000;
/* 接続を確立するためのタイムアウト時間を指定します。 単位:ミリ秒。 デフォルト値: 5000。 */
conf.connectTimeoutMs = 8000;
/* 環境変数からアクセス資格情報を取得します。 サンプルコードを実行する前に、OSS_ACCESS_KEY_IDおよびOSS_ACCESS_KEY_SECRET環境変数が設定されていることを確認してください。 */
auto credentialsProvider = std::make_shared<EnvironmentVariableCredentialsProvider>();
OssClientクライアント (Endpoint, credentialsProvider, conf);
/* ネットワークリソースなどのリソースをリリースします。 */
ShutdownSdk();
0を返します。}
SSLベースの認証の設定
デフォルトでは、SSLベースの認証はOSS SDK for C ++ V1.8.2以降で有効になっています。 SSLベースの認証が失敗した場合は、SSL証明書のパスが正しいかどうかを確認するか、SSLベースの認証を無効にします。
次のサンプルコードは、SSLベースの認証を設定する方法の例を示しています。
#include <alibabacloud/oss/OssClient.h>
名前空間listaCloud::OSSを使用します。int main(void)
{
/* OSSへのアクセスに使用されるアカウントに関する情報を初期化します。 */
/* バケットが配置されているリージョンのエンドポイントを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。 */
std::string Endpoint = "yourEndpoint";
/* ネットワークリソースなどのリソースを初期化します。 */
InitializeSdk();
ClientConfiguration conf;
/* SSLベースの認証を設定します。 デフォルト値:true 値trueは、SSLベースの認証が有効になっていることを示します。 */
conf.verifySSL = true;
/* CA証明書のルートパスを指定します。 このパラメーターは、verifySSLがtrueに設定されている場合に有効です。 デフォルトでは、このパラメータは空のままです。 */
conf.caパス="/etc/ssl/certs/";
/* CA証明書のパスを指定します。 このパラメーターは、verifySSLがtrueに設定されている場合に有効です。 デフォルトでは、このパラメータは空のままです。 */
conf.caファイル="/etc/ssl/certs/ca-certificates.crt";
/* 環境変数からアクセス資格情報を取得します。 サンプルコードを実行する前に、OSS_ACCESS_KEY_IDおよびOSS_ACCESS_KEY_SECRET環境変数が設定されていることを確認してください。 */
auto credentialsProvider = std::make_shared<EnvironmentVariableCredentialsProvider>();
OssClientクライアント (Endpoint, credentialsProvider, conf);
/* ネットワークリソースなどのリソースをリリースします。 */
ShutdownSdk();
0を返します。}
帯域幅調整の設定
次のコードは、アップロードとダウンロードの帯域幅調整を設定する方法の例を示しています。
#include <alibabacloud/oss/OssClient.h>
# include <alibabacloud/oss/client/RateLimiter.h>
名前空間listaCloud::OSSを使用します。クラスUserRateLimiter: パブリックRateLimiter
{
パブリック:
UserRateLimiter() : rate_(0) {};
〜UserRateLimiter() {};
virtual void setRate(int rate) { rate_ = rate; };
virtual int Rate() const { return rate_; };
プライベート:
int rate_;
};
int main(void)
{
/* OSSへのアクセスに使用されるアカウントに関する情報を初期化します。 */
/* バケットが配置されているリージョンのエンドポイントを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。 */
std::string Endpoint = "yourEndpoint";
/* バケットの名前を指定します。 例: examplebucket. */
std::string BucketName = "examplebucket";
/* オブジェクトのフルパスを指定します。 オブジェクトのフルパスにバケット名を含めないでください。 例: exampledir/exampleobject.txt。 */
std::string ObjectName = "exampledir/exampleobject.txt";
/* ネットワークリソースなどのリソースを初期化します。 */
InitializeSdk();
ClientConfiguration conf;
auto sendrateLimiter = std::make_shared<UserRateLimiter>();
auto recvrateLimiter = std::make_shared<UserRateLimiter>();
conf.sendRateLimiter = sendrateLimiter;
conf.recvRateLimiter = recvrateLimiter;
/* 環境変数からアクセス資格情報を取得します。 サンプルコードを実行する前に、OSS_ACCESS_KEY_IDおよびOSS_ACCESS_KEY_SECRET環境変数が設定されていることを確認してください。 */
auto credentialsProvider = std::make_shared<EnvironmentVariableCredentialsProvider>();
OssClientクライアント (Endpoint, credentialsProvider, conf);
/* ダウンロードの帯域幅調整を設定します。 単位: KB/s。 */
recvrateLimiter->setRate(256);
/* アップロードの帯域幅調整を設定します。 単位: KB/s。 */
sendrateLimiter->setRate(256);
/* オブジェクトをアップロードします。 ローカルファイルのフルパスを指定します。 */
auto outcome = client.PutObject(BucketName, ObjectName, "yourLocalFilename");
/* アップロード中に制限速度を更新します。 単位: KB/s。 */
sendrateLimiter->setRate(300);
/* ネットワークリソースなどのリソースをリリースします。 */
ShutdownSdk();
0を返します。}
再試行ポリシーの設定
次のサンプルコードは、再試行ポリシーを設定する方法の例を示しています。
#include <alibabacloud/oss/OssClient.h>
# include <alibabacloud/oss/client/RetryStrategy.h>
名前空間listaCloud::OSSを使用します。クラスUserRetryStrategy: パブリックRetryStrategy
{
パブリック:
/* maxRetriesは、許可された再試行の最大回数を示します。 scaleFactorは、再試行を試みるまでの待ち時間を計算するために使用される係数を示す。 */
UserRetryStrategy(long maxRetries = 3、long scaleFactor = 300) :
m_scaleFactor(scaleFactor), m_maxRetries(maxRetries)
{}
/* shouldRetry関数を指定して、リクエストを再試行するかどうかを判断できます。 */
bool shouldRetry(const Error & error, long attemptedRetries) const;
/* calcDelayTimeMs関数を指定して、再試行が試行されるまでの待機時間を計算できます。 */
long calcDelayTimeMs(constエラー&エラー、long attemptedRetries) const;
プライベート:
long m_scaleFactor;
長いm_maxRetries;
};
bool UserRetryStrategy::shouldRetry(const Error & error, long attemptedRetries) const
{
if (attemptedRetries >= m_maxRetries)
return false;
long responseCode = error.Status();
// httpコード
if (((responseCode == 403 && error.Message()).find("RequestTimeTooSkewed") != std::string::npos) | | |
(responseCode > 499 && responseCode < 599) {
return true;
}
else {
スイッチ (responseCode)
{
// curlエラーコード
ケース (ERROR_CURL_BASE + 7): // CURLE_COULDNT_CONNECT
ケース (ERROR_CURL_BASE + 18): // CURLE_PARTIAL_FILE
ケース (ERROR_CURL_BASE + 23): // CURLE_WRITE_ERROR
ケース (ERROR_CURL_BASE + 28): // CURLE_OPERATION_TIMEDOUT
ケース (ERROR_CURL_BASE + 52): // CURLE_GOT_NOTHING
ケース (ERROR_CURL_BASE + 55): // CURLE_SEND_ERROR
ケース (ERROR_CURL_BASE + 56): // CURLE_RECV_ERROR
return true;
default:
break;
};
}
falseを返します。}
long UserRetryStrategy::calcDelayTimeMs(const Error & error, long attemptedRetries) const
{
return (1 << attemptedRetries) * m_scaleFactor;
}
int main(void)
{
/* OSSへのアクセスに使用されるアカウントに関する情報を初期化します。 */
/* バケットが配置されているリージョンのエンドポイントを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。 */
std::string Endpoint = "yourEndpoint";
/* ネットワークリソースなどのリソースを初期化します。 */
InitializeSdk();
ClientConfiguration conf;
/* リクエストが失敗した場合に許可される再試行の最大回数を指定します。 デフォルト値: 3。 */
auto defaultRetryStrategy = std::make_shared<UserRetryStrategy>(5);
conf.retryStrategy = defaultRetryStrategy;
/* 環境変数からアクセス資格情報を取得します。 サンプルコードを実行する前に、OSS_ACCESS_KEY_IDおよびOSS_ACCESS_KEY_SECRET環境変数が設定されていることを確認してください。 */
auto credentialsProvider = std::make_shared<EnvironmentVariableCredentialsProvider>();
OssClientクライアント (Endpoint, credentialsProvider, conf);
/* ネットワークリソースなどのリソースをリリースします。 */
ShutdownSdk();
0を返します。}
プロキシサーバーの設定
次のサンプルコードは、プロキシサーバーを構成する方法の例を示しています。
#include <alibabacloud/oss/OssClient.h>
名前空間listaCloud::OSSを使用します。int main(void)
{
/* OSSへのアクセスに使用されるアカウントに関する情報を初期化します。 */
/* バケットが配置されているリージョンのエンドポイントを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。 */
std::string Endpoint = "yourEndpoint";
/* ネットワークリソースなどのリソースを初期化します。 */
InitializeSdk();
ClientConfiguration conf;
/* プロキシサーバーのアドレスを指定します。 */
conf.proxyHost = "yourProxyHost";
/* プロキシサーバーのポートを設定します。 */
conf.proxyPort = 1234;
/* オプション。 プロキシサーバー認証のユーザー名を指定します。 */
conf.proxyUserName = "yourProxyUserName";
/* オプション。 プロキシサーバー認証のパスワードを指定します。 */
conf.proxyPassword = "yourProxyPassword";
/* 環境変数からアクセス資格情報を取得します。 サンプルコードを実行する前に、OSS_ACCESS_KEY_IDおよびOSS_ACCESS_KEY_SECRET環境変数が設定されていることを確認してください。 */
auto credentialsProvider = std::make_shared<EnvironmentVariableCredentialsProvider>();
OssClientクライアント (Endpoint, credentialsProvider, conf);
/* ネットワークリソースなどのリソースをリリースします。 */
ShutdownSdk();
0を返します。}