Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过libcurl的POST请求失败_Curl_Libcurl - Fatal编程技术网

通过libcurl的POST请求失败

通过libcurl的POST请求失败,curl,libcurl,Curl,Libcurl,卷曲\ -X柱\ -H“内容类型:应用程序/json”\ -H“身份验证:API密钥$API_密钥”\ -H“授权:持票人$ACCESS_令牌” --数据二进制“{”命令“:“开”,“级别”:75,“设备id”:67890}” 这是控制insteon设备的curl命令,它通过终端在linux机器上运行良好 我试图使用CURL命令运行相同的命令,但它抛出了错误。 如果有人能帮助我以curl命令格式发送上述请求,那将是非常有帮助的 片段: curl_easy_setopt(curl, CURLOP

卷曲\ -X柱\ -H“内容类型:应用程序/json”\ -H“身份验证:API密钥$API_密钥”\ -H“授权:持票人$ACCESS_令牌” --数据二进制“{”命令“:“开”,“级别”:75,“设备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);

看起来一点也不坏

一个错误:删除
--数据二进制文件

 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二进制文件只是简单地复制到post数据中;)

我假设您使用
curl\u easy\u init
正确初始化了
curl
,并在代码片段中忽略了这一点


编辑:添加了将curl命令行转换为libcurl源代码的最简单方法:

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

--libcurl source.c部分将使用curl命令行设置的选项生成源代码模板。这通常会让你几乎一下子就到家。

无论如何,请添加代码片段CURLOPT_CUSTOMREQUEST在这里没有任何作用。POSTFIELDS表示已经有帖子了。“它正在抛出错误”?到底是什么错误?嗨,linux机器中没有错误,但是当我在windows机器中移植相同的代码时,curl\u easy\u perform(curl);正在返回CURLE_SSL_CACERT。我还没有调试它,所以我会在调试完windows中的代码后更新您,我们需要添加curl\u easy\u setopt(curl,CURLOPT\u SSL\u VERIFYPEER,0);作为额外的,它将开始工作。我根据你的建议尝试删除--数据二进制文件,但不起作用。我尝试使用PUT和POST。我用curl\u easy\u init初始化了curl,您不需要CURLOPT\u POSTFIELDSIZE;如果没有它,libcurl将设置给定字符串的大小。@DanielStenberg如果它以前在某个地方设置过,将其重置为-1将恢复您描述的行为。这就是我把它包括在内的原因。特别是,因为curl的初始化代码在代码段中不可见,所以这确实是一个很好的特性。无论如何,OP发现他的错误也不会太糟糕。