【问题标题】:HTTP POST with LibCurl带有 LibCurl 的 HTTP POST
【发布时间】:2017-12-08 23:52:35
【问题描述】:

使用 libcurl C++ 发送 POST 请求。我几乎尝试了所有组合,除了我想不出来的正确组合。

curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, FALSE);  /*Not Recommended to use but since certificates are not available this is a workaround added*/
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, FALSE);  /*Not Recommended to use but since certificates are not available this is a workaround added*/

curl_easy_setopt(curl, CURLOPT_HTTPPOST, TRUE);  //CURLOPT_POST does not work as well
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, sJson);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, bytesCallback);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &readBuffer);
curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, bytesCallback);
curl_easy_setopt(curl, CURLOPT_HEADERDATA, &headBuffer);

sJson 是一个std::string,其主体由pb2json 创建。

我无法弄清楚为什么没有发送尸体? 如果 libcurl,我是否缺少一些 API,感谢任何线索!

【问题讨论】:

  • 正文还是标题?
  • 没有像服务器所说的那样发送正文Received login request with no body
  • HTTPPOST 发送多部分消息。你想要 CURLOPT_POST 代替。
  • 即使CURLOPT_POST 也不起作用
  • 看起来您也编写了自定义标题。我使用 CURLOPT_HTTPHEADER 设置自定义标题: curl_slist *header_list = ::curl_slist_append(nullptr, header.data()); ::curl_easy_setopt(m_curl_handle, CURLOPT_HTTPHEADER, header_list);

标签: c++ libcurl


【解决方案1】:

我更喜欢在这里使用自定义请求CURLOPT_CUSTOMREQUEST 下面是运行良好的代码 sn-p! 当您使用自定义请求时,没有任何意义,您必须明确定义 CURLOPT_HTTPHEADER

在这里使用一个列表,为简洁起见,我在这里使用了最少的代码。

另外,当你通过 sJson 传递它作为 c type string 使用 c_str() 并记住在传递内容长度时使用 +1(我最初不知何故错过了),就像在 C 中一样,字符串只是 char 数组按照惯例,它以 NULL 字节结尾。

struct curl_slist* slist = NULL;
slist = curl_slist_append(slist, "Content-Type: application/json");
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, slist);

curl_easy_setopt(curl, CURLOPT_POSTFIELDS, sJson.c_str()); /* data goes here */
curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, sJson.length() + 1); /* data goes here */

编辑:使用curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "POST"); 可能会在重定向中产生问题,请根据您的用例使用它。

【讨论】:

  • 我建议删除CURLOPT_CUSTOMREQUEST, "POST"),因为如果您以后希望它遵循重定向等,这会导致头痛,并且在第一种情况下它不会添加任何内容。 CURLOPT_POSTFIELDS 表示 POST。
猜你喜欢
  • 2014-02-26
  • 1970-01-01
  • 2010-09-22
  • 1970-01-01
  • 1970-01-01
  • 2011-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多