关于rgw S3 libs3 (C/C++) S3-style subdomain接口访问
rgw 的S3 api是兼容S3,同样也提供了S3的特殊访问形式。
S3的两种访问形式:
1.Virtual Host: ${protocol}://${bucket}.s3.amazonaws.com/[${key}] (s3-style subdomain)
2.Path: ${protocol}://s3.amazonaws.com/${bucket}/[${key}] (普通path url访问形式)
以上两种方式在rgw中目前都是可以使用的。
关于S3 libs3(C/C++)API库,对两种访问形式的实现及使用:
在调用libs3的接口,需要指明你使用的s3 api的访问形式,该形式的可以通过指定已定义的枚举常量来标识;其常量定义如下:
typedef enum
{
S3UriStyleVirtualHost = 0, //标识使用Virtual host的访问形式
S3UriStylePath = 1 //path 访问形式
} S3UriStyle;
例如:S3中删除一个object的操作:
void S3_delete_object(const S3BucketContext *bucketContext, const char *key,
S3RequestContext *requestContext,
const S3ResponseHandler *handler, void *callbackData)
- 使用virtual host的访问形式
构造S3BucketContext结构体:
S3BucketContext bucketContext =
{
"www.aaa.cn",
"ssss",
S3ProtocolHTTP,
S3UriStyleVirtualHost,
"AD9DL40533G8EFF6YOJ4",
"hJi8K7qzIrEeFwwBWcxuv28yBLaCAtRjaOhTljCs",
0
};
S3ResponseHandler responseHandler =
{
0,
&responseCompleteCallback
};
删除eof这个对象。
S3_delete_object(&bucketContext, "eof", 0, &responseHandler, 0);
注:使用这种访问形式,用户(客户端)必须要对ssss.www.aaa.cn能够解析到rgw服务;因为在client端发出请求时是对ssss.www.aaa.cn解析的(delete http://ssss.www.aaa.cn/eof)。
- 使用path url普通访问形式
构造S3BucketContext结构体:
S3BucketContext bucketContext =
{
"www.aaa.cn",
"ssss",
S3ProtocolHTTP,
S3UriStylePath,
"AD9DL40533G8EFF6YOJ4",
"hJi8K7qzIrEeFwwBWcxuv28yBLaCAtRjaOhTljCs",
0
};
S3ResponseHandler responseHandler =
{
0,
&responseCompleteCallback
};
删除eof这个对象。
S3_delete_object(&bucketContext, "eof", 0, &responseHandler, 0);
注:使用这种普通访问形式,用户(客户端)必须要对www.aaa.cn能够解析到rgw服务;因为在client端发出请求时是对www.aaa.cn解析的(delete http://www.aaa.cn/ssss/eof)。
特殊实例
libs3的某些接口是不支持Virtual Host(s3-style subdomain)访问形式,如:
列出属于该用户(access_key)的所有buckets
void S3_list_service(S3Protocol protocol, const char *accessKeyId,
const char *secretAccessKey, const char *securityToken,
const char *hostName, S3RequestContext *requestContext,
const S3ListServiceHandler *handler,
void *callbackData);