使用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
相关产品推荐
相关产品推荐

