HTTP 调试工具使用示例

[English]

有关 HTTP 的常见问题请参考 HTTP FAQ

以下通过具体案例说明 ESP-IDF HTTP 报错的排查方法,并展示调试工具如何帮助快速确认问题原因和最终解决方案。

示例:客户端发送 GET 请求后无响应或返回错误信息

问题描述:

该示例使用 ESP32 设备作为 HTTP 服务器,苹果设备作为客户端。客户端发送多个发送 GET 请求,部分请求无响应或返回错误信息。

问题分析:

通过对比使用苹果设备访问和正常访问服务器时的客户端日志和 无线抓包 得出结论:使用苹果设备访问时,在发出 GET /api/sys/basic/get 请求后没有发出后续请求,导致 HTTP 服务器没有回复对应请求的 html 网页。

日志(左图为使用苹果设备访问,右图为正常访问)

无线抓包(左图为使用苹果设备访问,右图为正常访问)

示例:客户端发送 GET 请求后返回错误信息

问题描述:

该示例使用 ESP32 设备访问指定 HTTP 服务器并执行如下操作:

  1. 发送 GET 请求获取服务器信息

  2. 发送 POST 请求进行身份验证并获取 Token

  3. 将 Token 添加至请求头后再次发送 GET 请求获取用户信息

通过设备端日志观察到第二次 GET 请求返回 ERROR: The request could not be satisfied

问题分析:

  1. 状态码分析

通过查看设备端日志打印的 HTTP 状态码以及 HTTP 状态码定义 得出以下信息:

  • 第一次 GET 请求返回的状态码 200 对应 HttpStatus_Ok,表示该请求成功发送;

  • POST 请求同样返回状态码 200,表示该请求成功发送;

  • 第二次 GET 请求返回的 403 状态码对应 HttpStatus_Forbidden,表示请求被服务器拒绝执行。

  1. 启用应用层 Debug Log

通过 应用层 Debug Log 查看设备端 HTTP 客户端的完整请求和响应流程,根据日志内容可以确认 Authorization token 已正确加入请求头并成功传给服务器。

  1. 验证 Token 有效性

使用 HTTP 本地测试工具 传入设备端使用的 Token,返回状态码 200,说明该 token 有效且服务器允许访问。

  1. 抓包比对请求差异

通过 无线抓包 获取本地测试工具发送到服务器的请求内容,并与设备端 Debug Log 中的请求头进行对比。对比后发现设备端请求头中存在 Content-Length,而本地测试工具发送的请求没有该字段。

  1. 定位问题

在本地测试工具中加入 Content-Length 请求头(且值不为 0)后,再次访问服务器,同样返回 403,由此判断是 Content-Length 请求头导致服务器拒绝访问。进一步检查设备端代码后发现,POST 请求完成后未清空 body,导致后续 GET 请求自动带上了多余的 Content-Length,从而引发错误。

解决方法:

在发送完 POST 请求后,调用 esp_http_client_set_post_field(client, NULL, 0); 主动清空 HTTP body。其中 NULL 表示不再设置任何 POST 数据指针,0 表示请求体长度为 0,以保证后续 GET 请求不包含请求体。

重新编译并运行后,第二次发起的 GET 请求返回 200,表明用户数据已成功获取。