Curl命令行起作用,C ++ curl库没有

我试图通过C ++的curl库来做一些请求。 我可以成功地完成我的请求并通过命令行获得正确的响应,但是我无法通过C ++代码获得正确的响应。 我的命令行命令看起来像这样

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 ++代码中执行相同的请求。 我的代码看起来像这样

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正文。

这里有什么问题? 我究竟做错了什么? 有任何想法吗?


以下是适用于您的示例代码。

请注意,我:

  • 因为它看起来不像你实际上传的东西,而只是做一个简单的POST ,所以删除了CURLOPT_UPLOAD

  • CURLOPT_CUSTOMREQUEST更改为CURLOPT_POST (不是它应该重要),但我觉得它更干净。

  • 重新排序的CURLOPT_POSTFIELDSIZE_LARGECURLOPT_COPYPOSTFIELDS

  • 为了这个示例代码,删除了CURLOPT_WRITEDATA行。

  • 我仅通过连接到nc -l localhost 80的实例来测试以下内容

     static size_t callback(char *ptr, size_t size, size_t nmemb, void *userdata)
     {
       string s(ptr);
       cout << s << endl;
       return size * nmemb;
     }
    
    
     int main(int argc, char** argv)
     {
       string m_authorization("PWNED");
       string m_url("http://localhost");
       string m_json("{}");
    
       curl_global_init(CURL_GLOBAL_ALL);
    
       CURL* curlHandle = curl_easy_init();
    
       struct curl_slist* headers = nullptr;
       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_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());
    
       // <= You are not uploading anything actually, this is a simple POST with payload
       // enable uploading
       // curl_easy_setopt(curlHandle, CURLOPT_UPLOAD, 1L);
    
       // set HTTP method to POST
       curl_easy_setopt(curlHandle, CURLOPT_POST, 1L);
    
       // set data size before copy
       curl_easy_setopt(curlHandle, CURLOPT_POSTFIELDSIZE_LARGE, m_json.size());
    
       // set json data; I use EXACTLY the same string as in command line
       curl_easy_setopt(curlHandle, CURLOPT_COPYPOSTFIELDS, m_json.c_str());
    
       // 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_slist_free_all(headers);
    
       curl_easy_cleanup(curlHandle);
       curl_global_cleanup();
       return 0;
     }
    

    在Windows中,你必须用下面的函数初始化winsock的东西

    curl_global_init(CURL_GLOBAL_ALL);
    

    问题解决了坦克对Rocki's和drew010的评论。

  • 我已经删除了CURLOPT_CUSTOMREQUESTCURLOPT_UPLOADCURLOPT_NOSIGNAL设置语句,因为不需要它们。
  • 我也删除了用于设置CURLOPT_POSTFIELDSIZE_LARGE的行,但如果在设置CURLOPT_COPYPOSTFIELDS之前设置它,它也可以正常工作。 如果在CURLOPT_COPYPOSTFIELDS之前尚未设置大小,则假定数据为零终止的字符串; 否则,存储的大小通知图书馆关于要复制的字节数。 在任何情况下,在CURLOPT_COPYPOSTFIELDS之后,除非发布另一个CURLOPT_POSTFIELDSCURLOPT_COPYPOSTFIELDS选项,否则不能更改大小。 (请参阅:curl.haxx.se/libcurl/c/CURLOPT_COPYPOSTFIELDS.html)
  • 链接地址: http://www.djcxy.com/p/33513.html

    上一篇: Curl command line works, C++ curl library does not

    下一篇: Entity Framework/LINQ/MSSQL vs Entity Framework/LINQ/MYSQL