首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Curl命令行工作,C++ curl库不工作。

Curl命令行工作,C++ curl库不工作。
EN

Stack Overflow用户
提问于 2016-04-18 13:27:47
回答 2查看 1.7K关注 0票数 7

我正试图通过C++的curl库进行一些请求。我可以成功地完成我的请求,并通过命令行获得正确的响应,但不能通过C++代码获得正确的响应。我的命令行命令如下所示

代码语言:javascript
运行
复制
curl -X POST -H 'Accept: application/json' -H 'Content-Type: application/json' -H 'Authorization: <some_hash_value>' -k <my_full_url> -data '<my_json_string>'

效果很好。现在,我尝试在C++代码中执行相同的请求。我的代码如下所示

代码语言:javascript
运行
复制
void performRequest(const std::string& json, const void* userData, CallbackFunction callback)
{
    struct curl_slist* headers = NULL;

    headers = curl_slist_append(headers, "Accept: application/json");
    headers = curl_slist_append(headers, "Content-Type: application/json");
    headers = curl_slist_append(headers, (std::string("Authorization: ") + m_authorization).c_str());

    CURL* curlHandle = curl_easy_init();
    if (!curlHandle)
    {
        std::cerr << "Curl handler initialization failed";
    }

    curl_easy_setopt(curlHandle, CURLOPT_NOSIGNAL, 1);
    curl_easy_setopt(curlHandle, CURLOPT_HTTPHEADER, headers);

    // specify target URL, and note that this URL should include a file name, not only a directory
     curl_easy_setopt(curlHandle, CURLOPT_URL, m_url.c_str());

    // enable uploading
    curl_easy_setopt(curlHandle, CURLOPT_UPLOAD, 1L);

    // set HTTP method to POST
    curl_easy_setopt(curlHandle, CURLOPT_CUSTOMREQUEST, "POST");

    // set json data; I use EXACTLY the same string as in command line
    curl_easy_setopt(curlHandle, CURLOPT_COPYPOSTFIELDS, json.c_str());

    // set data size
    curl_easy_setopt(curlHandle, CURLOPT_POSTFIELDSIZE_LARGE, json.size());

    // set user data for getting it in response
    curl_easy_setopt(curlHandle, CURLOPT_WRITEDATA, userData);    // pointer to a custom struct

    // set callback function for getting response
    curl_easy_setopt(curlHandle, CURLOPT_WRITEFUNCTION, callback);    // some callback

    // send request
    curl_easy_perform(curlHandle);

    curl_easy_cleanup(curlHandle);
    curl_slist_free_all(headers);
}

但是,由于某些原因,我从服务器获得了响应中的错误,由此可以假设代码的请求与命令行的命令不等效。身体似乎不是被送去的。当我使用CURLOPT_DEBUGFUNCTION来转储调试信息时,我无法看到我的请求Json主体。

这里有什么问题?我做错了什么?有什么想法吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-04-25 15:35:09

罗基drew010的评论解决了这个问题。

  1. 我已经删除了CURLOPT_CUSTOMREQUESTCURLOPT_UPLOADCURLOPT_NOSIGNAL设置语句,因为它们不需要它们。
  2. 我还删除了设置CURLOPT_POSTFIELDSIZE_LARGE的行,但如果在设置CURLOPT_COPYPOSTFIELDS之前设置它,它可以正常工作。如果未在CURLOPT_COPYPOSTFIELDS之前设置大小,则假定数据为以零结尾的字符串;否则存储的大小将通知库要复制的字节计数。在任何情况下,除非发出了另一个CURLOPT_COPYPOSTFIELDSCURLOPT_COPYPOSTFIELDS选项,否则不能在CURLOPT_POSTFIELDS之后更改大小。(见:COPYPOSTFIELDS.html
票数 1
EN

Stack Overflow用户

发布于 2016-04-26 08:48:10

在windows中,您必须插入具有以下功能的winsock组件。

代码语言:javascript
运行
复制
curl_global_init(CURL_GLOBAL_ALL);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36695400

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档