我正在用libcurl编写一段c ++代码来调用Amazon s3 RESTful服务,如下所示:
void SampleOfS3Get()
{
//Init curl
curl_global_init(CURL_GLOBAL_ALL);
CURL* curlHandle = curl_easy_init();
//Init var
char* curlErrStr = (char*)malloc(CURL_ERROR_SIZE);
curl_slist* httpHeaders = NULL;
const char* date = getDateForHeader();
httpHeaders = curl_slist_append(httpHeaders, "Host: s3.amazonaws.com");//Set Host
httpHeaders = curl_slist_append(httpHeaders, date);//Set Date
httpHeaders = curl_slist_append(httpHeaders, getAuthorizationForHeader("AKIAISZALBSY-----XGQ","tIzCC----------/Jsn5KqTfuCAWyD1eyeOKStx0",date));//Set authorization
//Execute
if(curlHandle)
{
curl_easy_setopt(curlHandle, CURLOPT_VERBOSE, CURLOPT_STDERR);//Set verbose mode
curl_easy_setopt(curlHandle, CURLOPT_FOLLOWLOCATION,1);//Set automaticallly redirection
curl_easy_setopt(curlHandle, CURLOPT_MAXREDIRS,1);//Set max redirection times
curl_easy_setopt(curlHandle, CURLOPT_ERRORBUFFER, curlErrStr);//Set error buffer
curl_easy_setopt(curlHandle, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);//Set http version 1.1
curl_easy_setopt(curlHandle, CURLOPT_HEADER, httpHeaders);//Set headers
curl_easy_setopt(curlHandle, CURLOPT_URL, "http://s3.amazonaws.com/");//Set URL
CURLcode curlErr = curl_easy_perform(curlHandle);//Perform
if(curlErr)
{
cout<<curl_easy_strerror(curlErr)<<endl;
}
//Output redirection url
if(CURLE_OK == curlErr)
{
char *url;
curlErr = curl_easy_getinfo(curlHandle, CURLINFO_EFFECTIVE_URL, &url);
if((CURLE_OK == curlErr) && url)
cout<<"CURLINFO_EFFECTIVE_URL: "<<url<<endl;
}
/* Clean-up libcurl */
curl_global_cleanup();
}
}
此函数调用“GET SERVICE”以获取指定用户的所有存储桶列表。但此HTTP请求的HTTP响应结果是“使用http状态代码临时重定向到http://aws.amazon.com/s3” 307。
然后我在官方文档中发现它意味着调用者应该自己处理重定向,所以我也添加了CURLOPT_FOLLOWLOCATION属性。然后结果证明是亚马逊s3的网页内容。
更多详情:http://docs.aws.amazon.com/AmazonS3/latest/dev/RESTAuthentication.html?r=1821 当我在上面的链接中使用示例accessID和accessKey时,我得到了正确的签名“示例列出所有我的桶”显示。我很困惑我服务器重定向我的请求而不是返回我自己的预期所有桶列表(使用我自己的accessID和accessKey)。
有人遇到类似我的问题吗?SOS ......
答案 0 :(得分:0)
您应该首先阅读http://docs.aws.amazon.com/AmazonS3/latest/dev/RESTAPI.html,因为您当前的代码包含许多问题。特别要确保您完全理解Signing and Authenticating REST Requests的工作方式。