LibCurl CURLOPT_URL不接受字符串? C ++

时间:2014-05-18 11:21:19

标签: c++ syntax-error libcurl

所以基本上我想要做的是使用libcurl来获取稍微不同的URL,例如:

http://foo.com/foo.asp?name=*NAMEHERE*

我想要做的是遍历名称向量并获取每个名称,例如:

http://foo.com/foo.asp?name=James

然后

http://foo.com/foo.asp?name=Andrew

等等。

然而,当我尝试这样做时:

int foo (){
    CURL *curl;
    CURLcode success;
    char errbuf[CURL_ERROR_SIZE];
    int m_timeout = 15;

    if ((curl = curl_easy_init()) == NULL) {
        perror("curl_easy_init");
        return 1;
    }

    std::vector<std::string> names;

    names.push_back("James");
    names.push_back("Andrew");

    for (std::vector<std::string>::const_iterator i = names.begin(); i != names.end(); ++i){
        curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, errbuf);
        curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);

        curl_easy_setopt(curl, CURLOPT_TIMEOUT, long(m_timeout));
        curl_easy_setopt(curl, CURLOPT_URL, "http://foo.com/foo.asp?name=" + *i);
        curl_easy_setopt(curl, CURLOPT_COOKIEFILE, "cookies.txt");
        curl_easy_setopt(curl, CURLOPT_COOKIEJAR, "cookies.txt");
        curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
        curl_easy_setopt(curl, CURLOPT_AUTOREFERER, 1L);
    }

    if ((success = curl_easy_perform(curl)) != 0) {
        fprintf(stderr, "%s: %s\n", "curl_easy_perform", errbuf);
        return 1;
    }

    curl_easy_cleanup(curl);

    return 0;
}

它给了我一个错误:

  

无法传递非平凡类型的对象&#39; std :: __ 1 :: basic_string&lt; char&gt;&#39;通过可变函数; call将在运行时中止

在这一行:

curl_easy_setopt(curl, CURLOPT_URL, "http://foo.com/foo.asp?name=" + *i);

因为+ *i

我想做的是什么?有解决方案吗?

编辑:感谢您的回答,但出于某种原因,当我运行它时,它只获取带有向量中最后一个字符串的网站,而忽略了其他字符串。就我而言,它会跳过James并直接转到Andrew。为什么会这样?

2 个答案:

答案 0 :(得分:8)

curl_easy_setopt传递给CURLOPT_URL的参数必须是char *而不是std::string。您可以通过调用const char *成员函数从std::string获得c_str

std::string url = "http://foo.com/foo.asp?name=" + *i;
curl_easy_setopt(curl, CURLOPT_URL, url.c_str());

对于将来会在此结束的所有人,如果您还没有,请查看curl manual。还有online book

curl_easy_setopt的文档说您需要阅读有关特定选项的信息,以了解要使用的参数类型。

  

所有选项均使用选项后跟参数进行设置。该参数可以是long,函数指针,对象指针或curl_off_t,,具体取决于特定选项所需的内容。仔细阅读本手册,因为错误的输入值可能导致libcurl表现不佳!

CURLOPT_URL的文档确切地说明了参数类型需要的内容。

  

传入指向要使用的URL的指针。 参数应为char *到零终止字符串,必须采用以下格式进行URL编码:

     

scheme:// host:port / path

答案 1 :(得分:1)

  

出于某种原因,当我运行它时,它只获取带有向量中最后一个字符串的网站,并忽略其他字符串。就我而言,它会跳过James并直接转到Andrew。为什么会这样?

在每个循环迭代中,您使用不同的名称循环遍历配置curl对象的所有名称,然后在循环结束后仅调用curl_easy_perform(),因此它将仅检索已配置的姓氏。您需要将呼叫转移到循环内部的curl_easy_perform()

for (std::vector<std::string>::const_iterator i = names.begin(); i != names.end(); ++i)
{
    curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, errbuf);
    curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);

    curl_easy_setopt(curl, CURLOPT_TIMEOUT, long(m_timeout));

    string url = "http://foo.com/foo.asp?name=" + *i;
    curl_easy_setopt(curl, CURLOPT_URL, url.c_str());

    curl_easy_setopt(curl, CURLOPT_COOKIEFILE, "cookies.txt");
    curl_easy_setopt(curl, CURLOPT_COOKIEJAR, "cookies.txt");
    curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
    curl_easy_setopt(curl, CURLOPT_AUTOREFERER, 1L);

    success = curl_easy_perform(curl);
    if (success != 0) {
        fprintf(stderr, "%s: %s\n", "curl_easy_perform", errbuf);
        // handle the error as needed...
        continue;
    }

    // use the downloaded content as needed...
}