Lorsque l'option de paiement par le demandeur est activée pour un bucket dans Object Storage Service (OSS), le demandeur acquitte les frais liés aux requêtes et au trafic, et non le propriétaire du bucket. Ce dernier ne supporte que les frais de stockage. Vous pouvez activer cette option pour un bucket afin de partager les données qu'il contient sans avoir à payer les frais de requête et de trafic générés par l'accès à votre bucket.
Notes
Cette rubrique utilise l'endpoint public de la région Chine (Hangzhou). Si vous souhaitez accéder à OSS depuis d'autres services Alibaba Cloud situés dans la même région, utilisez un endpoint interne. Pour plus d'informations sur les régions et les endpoints OSS, consultez Régions et endpoints.
Cette rubrique explique comment créer une instance OSSClient avec un endpoint OSS. Pour d'autres configurations, telles que l'utilisation d'un domaine personnalisé ou l'authentification via des identifiants du Security Token Service (STS), reportez-vous à la section Créer une instance OssClient.
Pour activer le paiement par le demandeur, vous devez disposer de l'autorisation
oss:PutBucketRequestPayment. Pour interroger les configurations de paiement par le demandeur, vous devez disposer de l'autorisationoss:GetBucketRequestPayment. Pour en savoir plus, consultez la rubrique Accorder une politique personnalisée.
Définir le mode de paiement par le demandeur
Le code suivant montre comment activer le paiement par le demandeur pour un 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;
}
Obtenir la configuration du mode de paiement par le demandeur
Le code suivant illustre comment interroger les configurations de paiement par le demandeur d'un 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;
}
Accès tiers aux objets avec paiement par le demandeur
Si vous spécifiez que des tiers doivent payer pour l'accès aux objets d'un bucket, les demandeurs doivent inclure l'en-tête x-oss-request-payer:requester dans leurs requêtes HTTP pour effectuer des opérations sur vos objets. À défaut, une erreur est renvoyée.
L'exemple de code ci-dessous indique comment spécifier que des tiers sont facturés lorsqu'ils accèdent aux objets via les opérations PutObject, GetObject et DeleteObject. Vous pouvez appliquer la même méthode pour facturer les tiers lors d'opérations de lecture et d'écriture effectuées via d'autres API.
#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;
}
Références
Pour consulter l'exemple de code complet relatif au mode de paiement par le demandeur, rendez-vous sur l'exemple GitHub.
Pour plus d'informations sur l'opération API permettant d'activer le paiement par le demandeur, consultez PutBucketRequestPayment.
Pour plus d'informations sur l'opération API permettant d'interroger les configurations de paiement par le demandeur, consultez GetBucketRequestPayment.