通过libcurl的POST请求失败

时间:2015-12-17 09:09:16

标签: curl libcurl

卷曲https://connect.insteon.com/api/v2/commands \ -X POST \ -H“内容类型:application / json”\ -H“身份验证:APIKey $ API_KEY”\ -H“授权:Bearer $ 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);

2 个答案:

答案 0 :(得分: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复制到post数据中;)

我假设您使用curl正确初始化了curl_easy_init,并将其留在了您的代码段中。

编辑:已添加CURLOPT_POSTFIELDSIZE

答案 1 :(得分:1)

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

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

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