使用C++ cUrl库发送JSON数据失败求助
解决libcurl发送JSON数组到ifood API的问题
我来帮你排查下这个问题!从你给出的可行curl命令行来看,核心是要发送一个包含多个ID对象的JSON数组到ifood的事件确认API,但自己用libcurl写的函数出了问题。我们从常见的错误点入手,一步步解决:
先看一个可行的libcurl函数示例
假设你用的是C语言的libcurl库,这里给你一个完全对应命令行逻辑的完整函数实现:
#include <curl/curl.h> #include <stdio.h> #include <string.h> // 发送事件确认请求的函数 int send_event_acknowledgment(const char* access_token, const char* json_ids) { // 初始化curl句柄 CURL* curl = curl_easy_init(); if (!curl) { fprintf(stderr, "Failed to initialize curl\n"); return -1; } // 1. 设置请求URL curl_easy_setopt(curl, CURLOPT_URL, "https://pos-api.ifood.com.br/v1.0/events/acknowledgment"); // 2. 设置为POST请求 curl_easy_setopt(curl, CURLOPT_POST, 1L); // 3. 设置请求体(JSON数据) // 注意:json_ids必须是合法的JSON字符串,比如你命令行里的[{"id":"Event_id1"},...] curl_easy_setopt(curl, CURLOPT_POSTFIELDS, json_ids); // 如果JSON是动态生成的,建议指定长度避免截断 // curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, strlen(json_ids)); // 4. 构建并设置请求头 struct curl_slist* headers = NULL; // 构建Authorization头,注意bearer后面有空格! char auth_header[256]; snprintf(auth_header, sizeof(auth_header), "Authorization: bearer %s", access_token); headers = curl_slist_append(headers, auth_header); headers = curl_slist_append(headers, "Cache-Control: no-cache"); headers = curl_slist_append(headers, "Content-Type: application/json"); curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers); // 可选:开启调试模式,查看请求详情(方便排查问题) curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L); // 执行请求 CURLcode res = curl_easy_perform(curl); if (res != CURLE_OK) { fprintf(stderr, "Request failed: %s\n", curl_easy_strerror(res)); } // 清理资源 curl_slist_free_all(headers); curl_easy_cleanup(curl); return (res == CURLE_OK) ? 0 : -1; }
常见错误排查点
对照你的代码,检查以下几个最容易出错的地方:
- Content-Type头缺失:如果没设置
Content-Type: application/json,API会把你的JSON当成普通表单数据解析,直接失败。这是最常见的问题! - Authorization头格式错误:必须严格写成
bearer {access_token},注意bearer后面有一个空格,大小写也要正确(bearer是小写)。 - JSON字符串格式错误:确保传入的JSON是合法的——所有字符串用双引号,数组和对象的括号配对,没有语法错误。比如在C语言里拼接JSON时,要把双引号转义成
\"。 - 请求体传递错误:不要用
CURLOPT_POSTFIELDS传递表单字段,直接把完整的JSON字符串传进去就行。如果JSON里有\0字符,一定要用CURLOPT_POSTFIELDSIZE指定长度。 - SSL证书验证问题:如果你的环境没有正确配置根证书,HTTPS请求会失败。可以临时添加
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);跳过验证(但生产环境强烈建议配置合法证书)。
调试技巧
开启CURLOPT_VERBOSE选项后,libcurl会输出完整的请求和响应细节,你可以把它和命令行curl的输出对比,看看哪里不一样——比如请求头少了某个字段,或者JSON被截断了,很容易就能找到问题。
内容的提问来源于stack exchange,提问作者Luis Gama
相关产品推荐
相关产品推荐

