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

使用C语言发起HTTP JSON请求时提示无值可处理的问题求助

C语言libcurl发送JSON POST请求返回“无值可处理”问题排查

问题场景

使用C语言结合libcurl发送JSON格式的POST请求,API连接测试正常,但发送JSON数据时始终返回“无值可处理”提示。已修改HTTPS地址和accesskey,相关代码如下:

相关代码

发送请求的函数

void sendAPI(const char *json) {
    CURL *curl;
    CURLcode res;

    curl = curl_easy_init();
    if (!curl) {
        finish_with_error("Falha ao inicializar cURL");
    }

    curl_easy_setopt(curl, CURLOPT_URL, "https://monitoramento.loralora/api/");

    struct curl_slist *headers = NULL;
    headers = curl_slist_append(headers, "Content-Type: application/json");
    headers = curl_slist_append(headers, "acesskey: 49046a182af34gase52dfdbe8637940");
    curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);

    curl_easy_setopt(curl, CURLOPT_POSTFIELDS, json);

    res = curl_easy_perform(curl);
    if (res != CURLE_OK) {
        fprintf(stderr, "Erro na requisição cURL: %s\n", curl_easy_strerror(res));
    }

    curl_slist_free_all(headers);
    curl_easy_cleanup(curl);
}

生成JSON的代码

switch (tipoLeitura) {
    case 0:
        if (getRead()) {
            sprintf(json, "{\"SensorId\":\"%s\",\"codeVersion\":\"%s\",\"Measures\":                [{\"SensorComponentId\":\"%s_volh\",\"Measure\":%5.2f}, {\"SensorComponentId\":\"%s_cht\",\"Measure\":%5.2f}, {\"SensorComponentId\":\"%s_prem\",\"Measure\":%5.2f}, {\"SensorComponentId\":\"%s_ahp\",\"Measure\":%5.2f}, {\"SensorComponentId\":\"%s_bt\",\"Measure\":%5.2f}, {\"SensorComponentId\":\"%s_lt\",\"Measure\":%5.2f}]}", sensorID, version, sensorID, HeliumLevel, sensorID, ColdHeadTemperature, sensorID, MagnetPressure, sensorID, AverageHeaterPower, sensorID, BoreTemperature, sensorID, LinkTemperature);
        }
        break;
    default:
        break;
}

if ((unsigned)strlen(json) > 0) {
    // printf("JSON a ser enviado: %s\n", json);
    sendDataSensor(json); // Envia o JSON via HTTP POST
}

排查与解决建议

1. 修复JSON格式问题

  • 生成JSON的sprintf中,Measures字段后有大量多余空格,会导致JSON格式非法,API无法解析,直接删除这些多余空格。
  • 浮点数格式化用%5.2f会生成带前导空格的数值(如 23.45),部分API对空格敏感,建议改为%.2f去掉前导空格。
  • 取消注释printf("JSON a ser enviado: %s\n", json);,打印出生成的JSON字符串,手动检查格式是否正确,或用本地JSON校验工具确认合法性。

2. 修正curl请求配置

  • 检查函数调用一致性:代码中调用的是sendDataSensor(json),但定义的发送函数是sendAPI,如果是笔误,需修正为sendAPI(json)。
  • 显式指定POST方法:添加curl_easy_setopt(curl, CURLOPT_POST, 1L);,避免潜在的请求方法判断问题。
  • 捕获API响应内容:添加回调函数获取API返回的详细错误信息,示例代码如下:
    size_t write_callback(void *contents, size_t size, size_t nmemb, void *userp) {
        size_t total_len = size * nmemb;
        strncat((char*)userp, (char*)contents, total_len);
        ((char*)userp)[total_len] = '\0';
        return total_len;
    }
    
    // 在sendAPI函数中添加
    char response_buffer[1024] = {0};
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_callback);
    curl_easy_setopt(curl, CURLOPT_WRITEDATA, response_buffer);
    
    // 执行请求后打印响应
    res = curl_easy_perform(curl);
    if (res == CURLE_OK) {
        printf("API响应: %s\n", response_buffer);
    }
    

3. 确保变量正确初始化

  • 确认json变量是已初始化的字符数组,比如定义为char json[512] = {0};,避免未初始化的垃圾数据导致strlen(json)误判,进而发送无效内容。

内容的提问来源于stack exchange,提问作者Felipe Vieira

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 03:00:01