ESP32-ESP-IDF-HTTPS客户端
本文例程为ESP32 HTTPS客户端POST请求
只有HTTPS请求部分,联网部分省略默。。。
参考文档
乐鑫ESP-IDF API参考文档
所用API
函数 esp_http_client_init
//启动HTTP链接必须先调用此函数,返回值为为一个结构体对象,也是其它接口的必要参数
//失败返回NULL
//函数参数为constesp_http_client_config_t结构体指针(此结构体用于配置HTTP/HTTPS相关参数)
esp_http_client_handle_t esp_http_client_init(constesp_http_client_config_t *config)
结构体 constesp_http_client_config_t
此结构体用于配置HTTP/HTTPS参数
// 结构体成员如下
typedef struct {
const char *url;//HTTP/HTTPS的url地址
const char *host;//域名或ip(此项可不填)
int port;//请求的端口80或443(默认此项可不填)
const char *username;//用户名用于HTTP身份验证(不用不填)
const char *password;//密码用于HTTP身份验证(不用不填)
esp_http_client_auth_type_t auth_type;//HTTP身份验证类型默认为HTTP_AUTH_TYPE_NONE即无身份验证(默认即可)
const char *path;//HTTP路径默认为/(客户端无需此项)
const char *query;//HTTP查询
const char *cert_pem;//服务器SSL证书(作为HTTPS服务器时)
size_t cert_len;//证书长度
const char *client_cert_pem;//客户端SSL证书(作为客户端,服务器需要验证证书时)
size_t client_cert_len;//证书长度
const char *client_key_pem;//客户端证书密钥
size_t client_key_len;//密钥长度
const char *client_key_password;//密钥密码
size_t client_key_password_len;//密码长度
const char *user_agent;//要与 HTTP 请求一起发送的用户代理字符串
esp_http_client_method_t method;//请求模式默认为HTTP_METHOD_GET即GET方法可根据需要进行修改,也可以默认不填请求时直接调用接口
int timeout_ms;//网络超时时间
bool disable_auto_redirect;//禁用HTTP自动重定向
int max_redirection_count;//最大重定向数,如果为零,则使用默认值
int max_authorization_retries;//接收 HTTP 未授权状态代码时的最大连接重试次数,如果为零,则使用默认值。如果 -1 则禁用授权重试
http_event_handle_cb event_handler;//HTTP事件回调函数(重要)
esp_http_client_transport_t transport_type;//HTTP传输类型使用HTTP时填HTTP_TRANSPORT_OVER_TCP,使用HTTPS时填HTTP_TRANSPORT_OVER_SSL
int buffer_size;//HTTP接收缓冲区大小(一般默认即可)
int buffer_size_tx;//HTTP传输缓冲区大小
void *user_data;//HTTP user_data上下文
bool is_async;//设置异步模式,目前仅支持 HTTPS
bool use_global_ca_store;//
bool skip_cert_common_name_check;//跳过服务器证书 CN 字段的任何验证(注意此处有坑)
esp_err_t (*crt_bundle_attach)(void *conf);//指向esp_crt_bundle_attach的函数指针。允许使用证书捆绑包进行服务器验证,必须在menuconfig中启用
bool keep_alive_enable;//启用保持活动状态超时
int keep_alive_idle;//保持活动空闲时间。默认值为 5(秒)
int keep_alive_interval;//保持活动间隔时间。默认值为 5(秒)
int keep_alive_count;//保持活动状态数据包重试发送计数。默认值为 3 个计数
struct ifreq *if_name;//要通过的数据的接口的名称。使用默认界面而不设置
} esp_http_client_config_t;
设置HTTP/HTTPS请求方法
此接口可以手动设置HTTP请求方式(可以覆盖配置结构体的设置)
//client为esp_http_client_init函数返回的结构体对象
//method为需要设置的请求方式GET填HTTP_METHOD_GET,POST填HTTP_METHOD_POST,还有其它方式不一一列举了,可以去这个枚举类型里面看
//失败返回ESP_ERR_INVALID_ARG
esp_err_t esp_http_client_set_method(esp_http_client_handle_t client, esp_http_client_method_t method)
设置请求头(如果需要的话)
//client为esp_http_client_init函数返回的结构体对象
//key为键,valude为值,例如esp_http_client_set_header(client, "Content-Type", "application/json");
//失败返回ESP_FAIL
esp_err_t esp_http_client_set_header(esp_http_client_handle_t client, const char *key, const char *value)
设置请求内容
此处为POST请求
//client为esp_http_client_init函数返回的结构体对象
//data为传输的数据首地址
//len为数据长度
//失败返回ESP_FAIL
esp_err_t esp_http_client_set_post_field(esp_http_client_handle_t client, const char *data, int len)
发起HTTP/HTTPS请求
此接口默认以阻塞方式发起请求
//client为esp_http_client_init函数返回的结构体对象
//失败返回ESP_FAIL
esp_err_t esp_http_client_perform(esp_http_client_handle_t client)
关闭链接
此函数放在最后调用,功能与esp_http_client_init相反文章来源:https://www.toymoban.com/news/detail-454823.html
//client为esp_http_client_init函数返回的结构体对象
//失败返回ESP_FAIL
esp_err_t esp_http_client_cleanup(esp_http_client_handle_t client)
例程
#include "esp_system.h"
#include "esp_tls.h"
#include "esp_log.h"
#include "freertos/FreeRTOS.h"
#include "freertos/queue.h"
#include "freertos/semphr.h"
#include "freertos/task.h"
static const char *TAG = "APP_HTTP";
#define MAX_HTTP_RECV_BUFFER 512
#define MAX_HTTP_OUTPUT_BUFFER 2048
static esp_err_t _http_event_handler(esp_http_client_event_t *evt)
{
switch (evt->event_id)
{
case HTTP_EVENT_ERROR:
//当执行过程中出现任何错误时,会发生此事件
ESP_LOGD(TAG, "HTTP_EVENT_ERROR");
break;
case HTTP_EVENT_ON_CONNECTED:
// 一旦 HTTP 连接到服务器,就不会执行任何数据交换
break;
case HTTP_EVENT_HEADER_SENT:
// 将所有标头发送到服务器后发生此事件
break;
case HTTP_EVENT_ON_HEADER:
// 在接收从服务器发送的每个标头时发生
break;
case HTTP_EVENT_ON_DATA:
ESP_LOGI(TAG, "HTTP_EVENT_ON_DATA, len=%d", evt->data_len);
//在此处理HTTP请求返回的数据
break;
case HTTP_EVENT_ON_FINISH:
// 完成 HTTP 会话时发生
break;
case HTTP_EVENT_DISCONNECTED:
// 连接断开时发生此事件
break;
}
return ESP_OK;
}
static void http_rest_with_url(void *post_data)
{
esp_err_t err;
esp_http_client_config_t config1 = {
.url = "https://www.baidu.com",
.transport_type = HTTP_TRANSPORT_OVER_SSL,
.skip_cert_common_name_check = true,
// .port = 443,
.event_handler = _http_event_handler,
};
esp_http_client_handle_t client = esp_http_client_init(&config1);
// POST请求
esp_http_client_set_method(client, HTTP_METHOD_POST);
esp_http_client_set_header(client, "Content-Type", "application/json");
esp_http_client_set_post_field(client, post_data, strlen(post_data));
err = esp_http_client_perform(client);
if (err == ESP_OK)
{
ESP_LOGI(TAG, "Status = %d, content_length = %d", esp_http_client_get_status_code(client),
esp_http_client_get_content_length(client));
}
else
{
ESP_LOGE(TAG, "HTTP POST request failed: %s", esp_err_to_name(err));
}
free(post_data);
esp_http_client_cleanup(client);
}
填坑
ESP32做为客户端进行HTTPS请求时,如果不需要验证服务器证书也就是想跳过证书验证,
改constesp_http_client_config_t结构体中skip_cert_common_name_check成员是没有效果的。
他只会跳过检查证书的CN而不是CA,不会跳过整个证书验证。
所以如果想跳过证书则需要在menuconfig里面修改ESP-TLS选项,改为默认跳过服务器证书如下图
文章来源地址https://www.toymoban.com/news/detail-454823.html
到了这里,关于ESP32 HTTPS客户端POST请求(跳过证书验证)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!