OssClient用于管理存储空间(Bucket)和文件(Object)等OSS资源。使用C++ SDK发起OSS请求时,您需要初始化一个OssClient实例,并根据需要修改ClientConfiguration的默认配置项。
配置OssClient
ClientConfiguration是OssClient的配置类,您可通过此配置类来配置代理、连接超时、最大连接数等参数。可设置的参数如下:
参数 | 描述 |
---|---|
userAgent | 用户代理,指HTTP的User-Agent头。默认代理为aliyun-sdk-cpp/1.X.X。 |
maxConnections | 连接池数。默认为16个。 |
requestTimeoutMs | 请求超时时间。请求超时没有收到数据将会关闭连接,默认为10000ms。 |
connectTimeoutMs | 建立连接的超时时间。默认为5000ms。 |
retryStrategy | 自定义失败重试策略。 |
proxyScheme | 代理协议,默认为HTTP。 |
proxyPort | 代理服务器端口。 |
proxyPassword | 代理服务器验证的密码。 |
proxyUserName | 代理服务器验证的用户名。 |
verifySSL | 是否开启SSL证书校验,默认关闭。
说明 C++ SDK 1.8.2及以上版本默认开启SSL证书校验。
|
caPath | 用于设置CA证书根路径,当verifySSL为true时有效,默认为空。 |
caFile | 用于设置CA证书路径,当verifySSL为true时有效,默认为空。 |
enableCrc64 | 是否开启CRC64校验,默认开启。 |
enableDateSkewAdjustment | 是否开启HTTP请求时间自动修正,默认开启。 |
sendRateLimiter | 上传限速(单位KB/s)。 |
recvRateLimiter | 下载限速(单位KB/s)。 |
设置超时时间
以下代码用于设置超时时间:
#include <alibabacloud/oss/OssClient.h> using namespace AlibabaCloud::OSS; int main(void) { /* 初始化网络等资源。*/ InitializeSdk(); ClientConfiguration conf; /* 设置连接池数,默认为16个。*/ conf.maxConnections = 20; /* 设置请求超时时间,超时没有收到数据就关闭连接,默认为10000ms。*/ conf.requestTimeoutMs = 8000; /* 设置建立连接的超时时间,默认为5000ms。*/ conf.connectTimeoutMs = 8000; OssClient client(Endpoint, AccessKeyId, AccessKeySecret, conf); /* 释放网络等资源。*/ ShutdownSdk(); return 0; }
设置SSL证书校验
C++ SDK 1.8.2及以上的版本默认自动开启SSL证书校验。如果出现SSL证书校验失败,您需要根据实际情况设置正确的证书路径,或者关闭SSL证书校验。
以下代码用于设置SSL证书校验:
#include <alibabacloud/oss/OssClient.h> using namespace AlibabaCloud::OSS; int main(void) { /* 初始化网络等资源。*/ InitializeSdk(); ClientConfiguration conf; /* 设置SSL证书校验开关,默认为true,即开启证书校验。*/ conf.verifySSL = true; /* 设置CA证书根路径,当verifySSL为true时有效,默认为空。*/ conf.caPath = "/etc/ssl/certs/"; /* 设置CA证书路径,当verifySSL为true时有效,默认为空。*/ conf.caFile = "/etc/ssl/certs/ca-certificates.crt";; OssClient client(Endpoint, AccessKeyId, AccessKeySecret, conf); /* 释放网络等资源。*/ ShutdownSdk(); return 0; }
设置限速处理
以下代码用于设置上传或下载限速:
#include <alibabacloud/oss/OssClient.h> #include <alibabacloud/oss/client/RateLimiter.h> using namespace AlibabaCloud::OSS; class UserRateLimiter : public RateLimiter { public: DefaultRateLimiter() :rate_(0) {}; ~DefaultRateLimiter() {}; virtual void setRate(int rate) { rate_ = rate; }; virtual int Rate() const { return rate_; }; private: int rate_; }; int main(void) { /* 初始化OSS账号信息。*/ std::string AccessKeyId = "yourAccessKeyId"; std::string AccessKeySecret = "yourAccessKeySecret"; std::string Endpoint = "yourEndpoint"; std::string BucketName = "yourBucketName"; std::string ObjectName = "yourObjectName"; /* 初始化网络等资源。*/ InitializeSdk(); ClientConfiguration conf; auto sendrateLimiter = std::make_shared<UserRateLimiter>(); auto recvrateLimiter = std::make_shared<UserRateLimiter>(); conf.sendRateLimiter = sendrateLimiter; conf.recvRateLimiter = recvrateLimiter; OssClient client(Endpoint, AccessKeyId, AccessKeySecret, conf); /* 设置下载限速(单位KB/s)。*/ recvrateLimiter->setRate(256); /* 设置上传限速(单位KB/s)。*/ sendrateLimiter->setRate(256); /* 上传文件。*/ auto outcome = client.PutObject(BucketName, ObjectName,"yourLocalFilename"); /* 上传过程中更新上传限速(单位KB/s)。*/ sendrateLimiter->setRate(300); /* 释放网络等资源。*/ ShutdownSdk(); return 0; }
设置重试策略
以下代码用于设置重试策略:
#include <alibabacloud/oss/OssClient.h> #include <alibabacloud/oss/client/RetryStrategy.h> using namespace AlibabaCloud::OSS; class UserRetryStrategy : public RetryStrategy { public: /* 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 Error & error, long attemptedRetries) const; private: long m_scaleFactor; long m_maxRetries; }; bool UserRetryStrategy::shouldRetry(const Error & error, long attemptedRetries) const { if (attemptedRetries >= m_maxRetries) return false; long responseCode = error.Status(); //http code if ((responseCode == 403 && error.Message().find("RequestTimeTooSkewed") != std::string::npos) || (responseCode > 499 && responseCode < 599)) { return true; } else { switch (responseCode) { //curl error code case (ERROR_CURL_BASE + 7): //CURLE_COULDNT_CONNECT case (ERROR_CURL_BASE + 18): //CURLE_PARTIAL_FILE case (ERROR_CURL_BASE + 23): //CURLE_WRITE_ERROR case (ERROR_CURL_BASE + 28): //CURLE_OPERATION_TIMEDOUT case (ERROR_CURL_BASE + 52): //CURLE_GOT_NOTHING case (ERROR_CURL_BASE + 55): //CURLE_SEND_ERROR case (ERROR_CURL_BASE + 56): //CURLE_RECV_ERROR return true; default: break; }; } return false; } long UserRetryStrategy::calcDelayTimeMs(const Error & error, long attemptedRetries) const { UNUSED_PARAM(error); return (1 << attemptedRetries) * m_scaleFactor; } int main(void) { /* 初始化网络等资源。*/ InitializeSdk(); ClientConfiguration conf; /* 设置失败请求重试次数,默认为3次。*/ auto defaultRetryStrategy = std::make_shared<UserRetryStrategy>(5); conf.retryStrategy = defaultRetryStrategy; OssClient client(Endpoint, AccessKeyId, AccessKeySecret, conf); /* 释放网络等资源。*/ ShutdownSdk(); return 0; }