初始化
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 验证,默认关闭 |
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;
}
设置限速处理
以下代码用于设置上传、下载限速:
#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重试等待时间的尺度因子 */
DefaultRetryStrategy(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 DefaultRetryStrategy::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")) ||
(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 DefaultRetryStrategy::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;
}
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。
评论