请求者付费模式是指由请求者支付读取存储空间(Bucket)内数据时产生的流量费用和请求费用,而Bucket拥有者仅支付存储费用。当您希望共享数据,但又不希望产生流量费用和请求费用时,您可以开启此功能。
注意事项
- 本文以华东1(杭州)外网Endpoint为例。如果您希望通过与OSS同地域的其他阿里云产品访问OSS,请使用内网Endpoint。关于OSS支持的Region与Endpoint的对应关系,请参见访问域名和数据中心。
- 本文以OSS域名新建OSSClient为例。如果您希望通过自定义域名、STS等方式新建OSSClient,请参见新建OssClient。
- 要设置请求者付费模式,您必须有
oss:PutBucketRequestPayment
权限;要获取请求者付费模式,您必须有oss:GetBucketRequestPayment
权限。具体操作,请参见为RAM用户授权自定义的权限策略。
设置请求者付费模式
以下代码用于设置请求者付费模式。
#include <alibabacloud/oss/OssClient.h>
using namespace AlibabaCloud::OSS;
int main(void)
{
/*初始化OSS账号信息。*/
/*阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。*/
std::string AccessKeyId = "yourAccessKeyId";
std::string AccessKeySecret = "yourAccessKeySecret";
/*yourEndpoint填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。*/
std::string Endpoint = "yourEndpoint";
/*填写Bucket名称,例如examplebucket。*/
std::string BucketName = "examplebucket";
/*初始化网络等资源。*/
InitializeSdk();
ClientConfiguration conf;
OssClient client(Endpoint, AccessKeyId, AccessKeySecret, conf);
/*设置请求者付费模式。*/
SetBucketRequestPaymentRequest request(BucketName);
request.setRequestPayer(RequestPayer::Requester);
auto outcome = client.SetBucketRequestPayment(request);
if (!outcome.isSuccess()) {
/*异常处理。*/
std::cout << "SetBucketRequestPayment fail" <<
",code:" << outcome.error().Code() <<
",message:" << outcome.error().Message() <<
",requestId:" << outcome.error().RequestId() << std::endl;
ShutdownSdk();
return -1;
}
/*释放网络等资源。*/
ShutdownSdk();
return 0;
}
获取请求者付费模式配置
以下代码用于获取请求者付费模式配置信息。
#include <alibabacloud/oss/OssClient.h>
using namespace AlibabaCloud::OSS;
int main(void)
{
/*初始化OSS账号信息。*/
/*阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。*/
std::string AccessKeyId = "yourAccessKeyId";
std::string AccessKeySecret = "yourAccessKeySecret";
/*yourEndpoint填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。*/
std::string Endpoint = "yourEndpoint";
/*填写Bucket名称,例如examplebucket。*/
std::string BucketName = "examplebucket";
/*初始化网络等资源。*/
InitializeSdk();
ClientConfiguration conf;
OssClient client(Endpoint, AccessKeyId, AccessKeySecret, conf);
/*获取请求者付费模式配置。*/
GetBucketRequestPaymentRequest request(BucketName);
auto outcome = client.GetBucketRequestPayment(request);
if (outcome.isSuccess())
{
std::cout << "GetBucketRequestPayment success Payer:" << outcome.result().Payer() << std::endl;
}
else {
/*异常处理。*/
std::cout << "GetBucketPayment fail" <<
",code:" << outcome.error().Code() <<
",message:" << outcome.error().Message() <<
",requestId:" << outcome.error().RequestId() << std::endl;
ShutdownSdk();
return -1;
}
/*释放网络等资源。*/
ShutdownSdk();
return 0;
}
第三方付费访问Object
第三方操作Object时需在HTTP Header中携带x-oss-request-payer:requester参数,否则会报错。
以下代码以PutObject、GetObject和DeleteObject为例,用于指定第三方付费访问Object。其他用于指定第三方付费的Object读写操作接口设置方法类似。
#include <alibabacloud/oss/OssClient.h>
using namespace AlibabaCloud::OSS;
int main(void)
{
/*初始化OSS账号信息。*/
/*阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。*/
std::string AccessKeyId = "yourAccessKeyId";
std::string AccessKeySecret = "yourAccessKeySecret";
/*填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。*/
std::string Endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
/*填写请求者所属账号的AccessKey。*/
std::string PayerAccessKeyId = "yourPayerAccessKeyId";
std::string PayerAccessKeySecret = "yourPayerAccessKeySecret";
/*填写请求者访问Bucket所在地域对应的Endpoint。*/
std::string PayerEndpoint = "yourPayerEndpoint";
/*填写请求者访问的Bucket名称,例如examplebucket。*/
std::string BucketName = "yourBucketName";
/*填写请求者的UID,例如148562088256****。*/
std::string PayerUID = "148562088256****";
/*填写请求者访问的Object的完整路径,完整路径中不能包含Bucket名称,例如exampledir/exampleobject.txt。*/
std::string ObjectName = "exampledir/exampleobject.txt";
/*初始化网络等资源。*/
InitializeSdk();
ClientConfiguration conf;
OssClient client(Endpoint, AccessKeyId, AccessKeySecret, conf);
OssClient payerClient(PayerEndpoint, PayerAccessKeyId, PayerAccessKeySecret, conf);
/*创建Bucket。*/
CreateBucketOutcome outCome = client.CreateBucket(CreateBucketRequest(BucketName));
/*设置请求者付费模式。*/
SetBucketRequestPaymentRequest request(BucketName);
request.setRequestPayer(RequestPayer::Requester);
auto payoutcome = client.SetBucketRequestPayment(request);
/*上传文件时设置请求者付费模式。*/
*content << "test cpp sdk";
PutObjectRequest putrequest(BucketName, ObjectName, content);
putrequest.setRequestPayer(RequestPayer::Requester);
auto putoutcome = payerClient.PutObject(putrequest);
/*下载文件到本地内存时设置请求者付费模式。*/
GetObjectRequest getrequest(BucketName, ObjectName);
getrequest.setRequestPayer(RequestPayer::Requester);
auto getoutcome = payerClient.GetObject(getrequest);
/*删除文件时设置请求者付费模式。*/
DeleteObjectRequest delrequest(BucketName, ObjectName);
delrequest.setRequestPayer(RequestPayer::Requester);
auto deloutcome = payerClient.DeleteObject(delrequest);
/*释放网络等资源。*/
ShutdownSdk();
return 0;
}
相关文档
- 关于请求者付费模式的完整示例代码,请参见GitHub示例。
- 关于设置请求者付费模式的API接口说明,请参见PutBucketRequestPayment。
- 关于获取请求者付费模式配置信息的API接口说明,请参见GetBucketRequestPayment。