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

设置超时时间

以下代码用于设置超时时间:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#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证书校验:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#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;
}

设置限速处理

以下代码用于设置上传或下载限速:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#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;
}

设置重试策略

以下代码用于设置重试策略:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
#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;
}