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