Skip to content

Latest commit

 

History

History
159 lines (100 loc) · 8.58 KB

esp_http_client.rst

File metadata and controls

159 lines (100 loc) · 8.58 KB

ESP HTTP 客户端

:link_to_translation:`en:[English]`

概述

esp_http_client 提供了一组 API,用于从 ESP-IDF 应用程序中发起 HTTP/S 请求,具体的使用步骤如下:

应用示例

使用 ESP HTTP 客户端发起 HTTP/S 请求的简单示例,可参考 :example:`protocols/esp_http_client`

HTTP 基本请求

如需了解实现细节,请参考应用示例中的 http_rest_with_urlhttp_rest_with_hostname_path 函数。

持久连接

持久连接是 HTTP 客户端在多次交换中重复使用同一连接的方法。如果服务器没有使用 Connection: close 头来请求关闭连接,连接就会一直保持开放,用于其他新请求。

为了使 ESP HTTP 客户端充分利用持久连接的优势,建议尽可能多地使用同一个句柄实例来发起请求,可参考应用示例中的函数 http_rest_with_urlhttp_rest_with_hostname_path。示例中,一旦创建连接,即会在连接关闭前发出多个请求(如 GETPOSTPUT 等)。

.. only:: esp32

     TLS 使用安全元件 (ATECC608)
    __________________________________

    安全元件 (ATECC608) 也可用于 HTTP 客户端连接中的底层 TLS 连接。请参考 :doc:`ESP-TLS 文档 </api-reference/protocols/esp_tls>` 中的 *ESP-TLS 中的 ATECC608A安全元件支持* 小节了解更多细节如需支持安全元素必须首先在 menuconfig 中通过 :ref:`CONFIG_ESP_TLS_USE_SECURE_ELEMENT` 对其进行启用此后可配置 HTTP 客户端使用安全元素如下所示:

    .. code-block:: c

        esp_http_client_config_t cfg = {
            /* other configurations options */
            .use_secure_element = true,
        };

HTTPS 请求

ESP HTTP 客户端支持使用 mbedTLS 的 SSL 连接,需将 url 配置为以 https 开头,或将 transport_type 设置为 HTTP_TRANSPORT_OVER_SSL。可以通过 :ref:`CONFIG_ESP_HTTP_CLIENT_ENABLE_HTTPS` 来配置 HTTPS 支持(默认启用)。

Note

在发起 HTTPS 请求时,如需服务器验证,首先需要向 esp_http_client_config_t 配置中的 cert_pem 成员提供额外的根证书(PEM 格式)。用户还可以通过 esp_http_client_config_t 配置中的 crt_bundle_attach 成员,使用 ESP x509 Certificate Bundle 进行服务器验证。

如需了解上文备注中的实现细节,请参考应用示例中的函数 https_with_urlhttps_with_hostname_path

HTTP 流

有些应用程序需要主动打开连接并控制数据交换(数据流)。在这种情况下,应用流程与常规请求不同。请参考以下示例:

如需了解实现细节,请参考应用示例中的函数 http_perform_as_stream_reader

HTTP 认证

ESP HTTP 客户端同时支持 基本摘要 认证。
  • 用户可以在 urlesp_http_client_config_t 配置中的 usernamepassword 处输入用户名和密码。对于 auth_type = HTTP_AUTH_TYPE_BASIC,HTTP 客户端只需执行一项操作就可通过认证过程。
  • 如果 auth_type = HTTP_AUTH_TYPE_NONE,但配置中有 usernamepassword 字段,HTTP 客户端需要执行两项操作。客户端在第一次尝试连接服务器时,会收到 401 Unauthorized 头,而后再根据这些信息来选择认证方法,并在第二项操作中执行。
  • 如需了解实现细节,请参考应用示例中的函数 http_auth_basichttp_auth_basic_redirect (用于基本认证)和 http_auth_digest (用于摘要认证)。
  • 目前,摘要认证仅支持 MD5 和 SHA-256 算法。

认证配置示例

  • 基于 URI 的认证

    esp_http_client_config_t config = {
        .url = "http://user:passwd@httpbin.org/basic-auth/user/passwd",
        .auth_type = HTTP_AUTH_TYPE_BASIC,
    };
  • 基于用户名和密码的认证

    esp_http_client_config_t config = {
        .url = "http://httpbin.org/basic-auth/user/passwd",
        .username = "user",
        .password = "passwd",
        .auth_type = HTTP_AUTH_TYPE_BASIC,
    };

事件处理

ESP HTTP 客户端支持事件处理,发生相关事件时会触发相应的事件处理程序。:cpp:enum:`esp_http_client_event_id_t` 中包含了所有使用 ESP HTTP 客户端执行 HTTP 请求时可能发生的事件。

通过 :cpp:member:`esp_http_client_config_t::event_handler` 设置回调函数即可启用事件处理功能。

ESP HTTP 客户端诊断信息

诊断信息可以帮助用户深入了解出现的问题。在 ESP HTTP 客户端中,可以通过在 :doc:`事件循环库 <../system/esp_event>` 中注册事件处理程序来获取诊断信息。此功能的增加基于 ESP Insights 框架,该框架可帮助收集诊断信息。然而,即使不依赖 ESP Insights 框架,也可以获取诊断信息。事件处理程序可通过 :cpp:func:`esp_event_handler_register` 函数注册到事件循环中。

事件循环中不同 HTTP 客户端事件的预期数据类型如下所示:

  • HTTP_EVENT_ERROR : esp_http_client_handle_t
  • HTTP_EVENT_ON_CONNECTED : esp_http_client_handle_t
  • HTTP_EVENT_HEADERS_SENT : esp_http_client_handle_t
  • HTTP_EVENT_ON_HEADER : esp_http_client_handle_t
  • HTTP_EVENT_ON_DATA : esp_http_client_on_data_t
  • HTTP_EVENT_ON_FINISH : esp_http_client_handle_t
  • HTTP_EVENT_DISCONNECTED : esp_http_client_handle_t
  • HTTP_EVENT_REDIRECT : esp_http_client_redirect_event_data_t

在无法接收到 :cpp:enumerator:`HTTP_EVENT_DISCONNECTED <esp_http_client_event_id_t::HTTP_EVENT_DISCONNECTED>` 之前,与事件数据一起接收到的 :cpp:type:`esp_http_client_handle_t` 将始终有效。这个句柄主要是为了区分不同的客户端连接,无法用于其他目的,因为它可能会随着客户端连接状态的变化而改变。

TLS 协议版本

可在 :cpp:type:`esp_http_client_config_t` 中设置用于底层 TLS 连接的 TLS 协议版本。了解更多信息,请参考 :doc:`/api-reference/protocols/esp_tls` 中的 TLS 协议版本 章节。

HTTP 客户端的 TLS 协议版本可按如下方式配置:

#include "esp_http_client.h"
esp_http_client_config_t config = {
    .tls_version = ESP_HTTP_CLIENT_TLS_VER_TLS_1_2,
};

API 参考

.. include-build-file:: inc/esp_http_client.inc