You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:18:01