Quando você ativa o pagamento pelo solicitante para um bucket no Object Storage Service (OSS), o solicitante paga as taxas de solicitação e de tráfego, e não o proprietário do bucket. O proprietário do bucket paga apenas as taxas de armazenamento. Você pode ativar o pagamento pelo solicitante em um bucket para compartilhar dados sem arcar com as taxas de solicitação e de tráfego geradas pelo acesso.
Observações
Este tópico utiliza o endpoint público da região China (Hangzhou). Para acessar o OSS a partir de outros serviços da Alibaba Cloud na mesma região, use um endpoint interno. Para mais informações sobre as regiões e endpoints do OSS, consulte Regiões e endpoints.
Este tópico demonstra como criar uma instância OSSClient com um endpoint do OSS. Para configurações alternativas, como o uso de domínio personalizado ou autenticação com credenciais do Security Token Service (STS), consulte Criar uma instância OssClient.
Para ativar o pagamento pelo solicitante, você precisa ter a permissão
oss:PutBucketRequestPayment. Para consultar as configurações de pagamento pelo solicitante, você deve ter a permissãooss:GetBucketRequestPayment. Para mais informações, consulte Conceder uma política personalizada.
Defina o modo de pagamento pelo solicitante
O código a seguir mostra um exemplo de como ativar o pagamento pelo solicitante para um bucket:
#include <alibabacloud/oss/OssClient.h>
using namespace AlibabaCloud::OSS;
int main(void)
{
/* Initialize the OSS account information. */
/* Set yourEndpoint to the endpoint of the region where the bucket is located. For example, if the bucket is in the China (Hangzhou) region, set the endpoint to https://oss-cn-hangzhou.aliyuncs.com. */
std::string Endpoint = "yourEndpoint";
/* Set yourRegion to the region where the bucket is located. For example, if the bucket is in the China (Hangzhou) region, set the region to cn-hangzhou. */
std::string Region = "yourRegion";
/* Specify the bucket name. For example, examplebucket. */
std::string BucketName = "examplebucket";
/* Initialize network resources. */
InitializeSdk();
ClientConfiguration conf;
conf.signatureVersion = SignatureVersionType::V4;
/* Obtain access credentials from environment variables. Before you run this sample code, make sure that the OSS_ACCESS_KEY_ID and OSS_ACCESS_KEY_SECRET environment variables are set. */
auto credentialsProvider = std::make_shared<EnvironmentVariableCredentialsProvider>();
OssClient client(Endpoint, credentialsProvider, conf);
client.SetRegion(Region);
/* Set the pay-by-requester mode. */
SetBucketRequestPaymentRequest request(BucketName);
request.setRequestPayer(RequestPayer::Requester);
auto outcome = client.SetBucketRequestPayment(request);
if (!outcome.isSuccess()) {
/* Handle the exception. */
std::cout << "SetBucketRequestPayment fail" <<
",code:" << outcome.error().Code() <<
",message:" << outcome.error().Message() <<
",requestId:" << outcome.error().RequestId() << std::endl;
return -1;
}
/* Release network resources. */
ShutdownSdk();
return 0;
}
Obtenha a configuração do modo de pagamento pelo solicitante
O código a seguir mostra um exemplo de como consultar as configurações de pagamento pelo solicitante de um bucket:
#include <alibabacloud/oss/OssClient.h>
using namespace AlibabaCloud::OSS;
const char* ToRequestPayerName(RequestPayer payer)
{
static const char* PayerName[] = { "NotSet", "BucketOwner", "Requester"};
return PayerName[static_cast<int>(payer) - static_cast<int>(RequestPayer::NotSet)];
}
int main(void)
{
/* Initialize the OSS account information. */
/* Set yourEndpoint to the endpoint of the region where the bucket is located. For example, if the bucket is in the China (Hangzhou) region, set the endpoint to https://oss-cn-hangzhou.aliyuncs.com. */
std::string Endpoint = "yourEndpoint";
/* Set yourRegion to the region where the bucket is located. For example, if the bucket is in the China (Hangzhou) region, set the region to cn-hangzhou. */
std::string Region = "yourRegion";
/* Specify the bucket name. For example, examplebucket. */
std::string BucketName = "examplebucket";
/* Initialize network resources. */
InitializeSdk();
ClientConfiguration conf;
conf.signatureVersion = SignatureVersionType::V4;
/* Obtain access credentials from environment variables. Before you run this sample code, make sure that the OSS_ACCESS_KEY_ID and OSS_ACCESS_KEY_SECRET environment variables are set. */
auto credentialsProvider = std::make_shared<EnvironmentVariableCredentialsProvider>();
OssClient client(Endpoint, credentialsProvider, conf);
client.SetRegion(Region);
/* Get the pay-by-requester mode configuration. */
GetBucketRequestPaymentRequest request(BucketName);
auto outcome = client.GetBucketRequestPayment(request);
if (outcome.isSuccess())
{
std::cout << "GetBucketRequestPayment success Payer:" << ToRequestPayerName(outcome.result().Payer()) << std::endl;
}
else {
/* Handle the exception. */
std::cout << "GetBucketPayment fail" <<
",code:" << outcome.error().Code() <<
",message:" << outcome.error().Message() <<
",requestId:" << outcome.error().RequestId() << std::endl;
return -1;
}
/* Release network resources. */
ShutdownSdk();
return 0;
}
Acesso de terceiros a objetos com pagamento pelo solicitante
Caso você especifique que terceiros pagarão pelo acesso a objetos em um bucket, os solicitantes deverão incluir o cabeçalho x-oss-request-payer:requester nas solicitações HTTP para executar operações em seus objetos. Se você não incluir esse cabeçalho, o sistema retornará um erro.
O código a seguir mostra um exemplo de como especificar que terceiros pagarão ao acessar objetos por meio das operações PutObject, GetObject e DeleteObject. Você pode usar esse mesmo método para definir que terceiros pagarão ao executar operações de leitura e gravação em objetos, chamando outras operações da API de maneira semelhante.
#include <alibabacloud/oss/OssClient.h>
#include <fstream>
using namespace AlibabaCloud::OSS;
int main(void)
{
/* Initialize the OSS account information. */
/* Set yourEndpoint to the endpoint of the region where the bucket is located. For example, if the bucket is in the China (Hangzhou) region, set the endpoint to https://oss-cn-hangzhou.aliyuncs.com. */
std::string Endpoint = "yourEndpoint";
/* Set yourRegion to the region where the bucket is located. For example, if the bucket is in the China (Hangzhou) region, set the region to cn-hangzhou. */
std::string Region = "yourRegion";
/* Specify the name of the bucket that the requester wants to access. For example, examplebucket. */
std::string BucketName = "examplebucket";
/* Specify the full path of the object that the requester wants to access. The full path cannot contain the bucket name. For example, exampledir/exampleobject.txt. */
std::string ObjectName = "exampleobject.txt";
/* Initialize network resources. */
InitializeSdk();
ClientConfiguration conf;
conf.signatureVersion = SignatureVersionType::V4;
/* Obtain access credentials from environment variables. Before you run this sample code, make sure that the requester's OSS_ACCESS_KEY_ID and OSS_ACCESS_KEY_SECRET are set as environment variables. */
auto credentialsProvider = std::make_shared<EnvironmentVariableCredentialsProvider>();
OssClient client(Endpoint, credentialsProvider, conf);
client.SetRegion(Region);
/* Set the pay-by-requester mode when you upload a file. */
std::shared_ptr<std::iostream> content = std::make_shared<std::stringstream>();
*content << "test cpp sdk";
PutObjectRequest putrequest(BucketName, ObjectName, content);
putrequest.setRequestPayer(RequestPayer::Requester);
auto putoutcome = client.PutObject(putrequest);
/* Set the pay-by-requester mode when you download a file to the local memory. */
GetObjectRequest getrequest(BucketName, ObjectName);
getrequest.setRequestPayer(RequestPayer::Requester);
auto getoutcome = client.GetObject(getrequest);
/* Set the pay-by-requester mode when you delete a file. */
DeleteObjectRequest delrequest(BucketName, ObjectName);
delrequest.setRequestPayer(RequestPayer::Requester);
auto deloutcome = client.DeleteObject(delrequest);
/* Release network resources. */
ShutdownSdk();
return 0;
}
Referências
Para acessar o código de exemplo completo do modo de pagamento pelo solicitante, consulte o exemplo no GitHub.
Para mais informações sobre a operação da API que você pode chamar para ativar o pagamento pelo solicitante, consulte PutBucketRequestPayment.
Para mais informações sobre a operação da API que você pode chamar para consultar as configurações de pagamento pelo solicitante, consulte GetBucketRequestPayment.