乐鑫技术交流
直播中

vinww特烦恼

8年用户 1091经验值
擅长:存储技术
私信 关注
[问答]

http读取百度返回的json数据时丢失数据怎么处理?

我在使用百度ai开放平台的语音识别功能,读取返回的数据时,使用esp_http_client_read(client, http_data, 1024);读到的数据里没有json的数据,还是http头的信息,这就很奇怪,可以确定的是不是百度服务器的问题,因为我用其他方式调用了该API返回的数据没错。
还有,就是当我的语音录音时说话超过4个字就会出现以上情况,只要不超过4个字,返回的结果中就存在json数据。
我猜测是http输入流的原因,但是实现搞不清楚。
错误的返回如下:它把http头信息读取了。。。。
"}
P/1.1 200 OK

Connection: keep-alive

Content-Type: application/json

Date: Sat, 21 Nov 2020 05:06:18 GMT

P3p: CP=" OTI DSP C

正确的返回应该是:
{"corpus_no":"6897438778089153756","err_msg":"success.","err_no":0,"result":["北京科技馆。"],"sn":"854581213211605935110"}
                                                                                                                                                              

回帖(1)

fdvcxhtg

2024-6-24 16:41:25
从您的描述来看,这个问题可能是由于HTTP响应头和响应体没有正确分离导致的。当您使用`esp_http_client_read(client, http_data, 1024);`读取数据时,可能同时读取了HTTP头和响应体。为了解决这个问题,您可以尝试以下步骤:

1. 首先,确保您已经正确地设置了HTTP请求。例如,使用正确的URL、请求方法(如POST或GET)和必要的请求头。

2. 在读取HTTP响应之前,先检查HTTP响应的状态码。通常,状态码为200表示请求成功。您可以使用以下代码片段来检查状态码:

```c
esp_err_t err = esp_http_client_get_status_code(client, &status_code);
if (err == ESP_OK && status_code == 200) {
    // 状态码为200,继续处理响应体
} else {
    // 处理错误情况
}
```

3. 接下来,尝试使用`esp_http_client_fetch_headers(client, &headers);`来获取HTTP头。这将允许您检查响应头并确保它们已经正确解析。

4. 在读取响应体之前,确保已经读取了所有响应头。您可以使用以下代码片段来实现这一点:

```c
bool headers_fetched = false;
while (!headers_fetched) {
    char header_buf[256];
    esp_err_t err = esp_http_client_fetch_headers(client, header_buf, sizeof(header_buf), &headers_fetched);
    if (err != ESP_OK) {
        // 处理错误情况
    }
}
```

5. 最后,使用`esp_http_client_read_response(client, http_data, 1024);`来读取响应体。这将确保您只读取JSON数据,而不是HTTP头。

```c
esp_err_t err = esp_http_client_read_response(client, http_data, 1024);
if (err == ESP_OK) {
    // 处理JSON数据
} else {
    // 处理错误情况
}
```

通过以上步骤,您应该能够正确地分离HTTP头和响应体,并避免丢失数据。如果问题仍然存在,请检查您的网络连接和设备性能,以确保它们不会影响数据传输。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分