【问题标题】:POST request via libcurl is failing通过 libcurl 的 POST 请求失败
【发布时间】:2015-12-17 09:09:16
【问题描述】:

卷曲https://connect.insteon.com/api/v2/commands\ -X 发布\ -H“内容类型:应用程序/json”\ -H "身份验证:APIKey $API_KEY" \ -H "授权:持有者 $ACCESS_TOKEN" --data-binary '{"command":"on","level":75,"device_id":67890}'

这是用于控制 insteon 设备的 curl 命令,它通过终端在 linux 机器上运行良好。

我试图使用 CURL 命令运行相同的命令,但它抛出错误。 如果有人可以帮助我以 curl 命令格式发送上述请求,那将有很大帮助。

片段:

 curl_easy_setopt(curl, CURLOPT_URL, "https://connect.insteon.com/api/v2/commands");

 list = curl_slist_append(list, "Content-Type: application/json");

 list = curl_slist_append(list,"Authentication: APIKey XXXXXX");

 list = curl_slist_append(list,"Authorization: Bearer XXXXX");

 curl_easy_setopt(curl, CURLOPT_HTTPHEADER, list);

/*I tried both PUT and POST as well*/

 curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "POST"); /* !!! */

 curl_easy_setopt(curl, CURLOPT_POSTFIELDS,"--data-binary '{\"command\":\"on\",\"level\":75,\"device_id\":738486}'"); /* data goes here */
    res = curl_easy_perform(curl);
    if(res != CURLE_OK)
    {
            curl_easy_strerror(res);
    }
    curl_easy_cleanup(curl);

【问题讨论】:

  • 无论如何请添加sn-p
  • CURLOPT_CUSTOMREQUEST 在那里毫无用处。 POSTFIELDS 已经是一个 POST。
  • “抛出错误”?究竟是什么错误?
  • 嗨,linux机器没有错误但是当我在windows机器中移植相同的代码时 curl_easy_perform(curl);正在返回 CURLE_SSL_CACERT。我还没有调试它,所以我会在调试代码后更新你
  • 在windows中我们需要添加 curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0);作为额外的,它将开始工作

标签: curl libcurl


【解决方案1】:

看起来一点也不差。

一个错误:删除--data-binary

 curl_easy_setopt(curl, CURLOPT_POSTFIELDS, "{\"command\":\"on\",\"level\":75,\"device_id\":738486}"); /* data goes here */
 curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, -1); /* curl uses strlen() to determine postfield-size */

这应该可以正常工作,否则 --data-binary 会被简单地复制到发布数据中;)

我假设您使用 curl_easy_init 正确初始化了 curl,并且只是将其留在了您的 sn-p 中。

编辑:添加CURLOPT_POSTFIELDSIZE

【讨论】:

  • 我尝试按照您的建议删除 --data-binary 但它不起作用我尝试同时使用 PUT 和 POST。我用 curl_easy_init 初始化了 curl
  • 你不需要 CURLOPT_POSTFIELDSIZE;没有它,libcurl 将根据给定的字符串设置大小。
  • @DanielStenberg 如果之前已设置,将其重置为 -1 会恢复您描述的行为。这就是我包含它的原因。特别是,由于 curl 的初始化代码在 sn-p 中不可见
【解决方案2】:

将 curl 命令行转换为 libcurl 源代码的最简单方法:

curl [all the options] --libcurl source.c

--libcurl source.c 部分将生成您的源代码模板,其选项设置与您的 curl 命令行所做的一样。这通常会让你几乎立刻回家。

【讨论】:

  • 这确实是一个不错的功能。无论如何,对于 OP 来说,找到他的错误可能不会太糟糕。
猜你喜欢
  • 1970-01-01
  • 2023-01-13
  • 2011-09-07
  • 2013-02-08
  • 2013-03-21
  • 1970-01-01
  • 1970-01-01
  • 2014-04-10
  • 2016-04-06
相关资源
最近更新 更多