使用libcurl调用Amazon s3 RESTful服务

时间:2013-11-16 04:14:46

标签: c++ rest amazon-s3 libcurl

我正在用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 ......

1 个答案:

答案 0 :(得分:0)

您应该首先阅读http://docs.aws.amazon.com/AmazonS3/latest/dev/RESTAPI.html,因为您当前的代码包含许多问题。特别要确保您完全理解Signing and Authenticating REST Requests的工作方式。