ESP32-ESP-IDF-HTTPS客戶端
本文例程為ESP32 HTTPS客戶端POST請(qǐng)求
只有HTTPS請(qǐng)求部分,聯(lián)網(wǎng)部分省略默。。。
參考文檔
樂(lè)鑫ESP-IDF API參考文檔
所用API
函數(shù) esp_http_client_init
//啟動(dòng)HTTP鏈接必須先調(diào)用此函數(shù),返回值為為一個(gè)結(jié)構(gòu)體對(duì)象,也是其它接口的必要參數(shù)
//失敗返回NULL
//函數(shù)參數(shù)為constesp_http_client_config_t結(jié)構(gòu)體指針(此結(jié)構(gòu)體用于配置HTTP/HTTPS相關(guān)參數(shù))
esp_http_client_handle_t esp_http_client_init(constesp_http_client_config_t *config)
結(jié)構(gòu)體 constesp_http_client_config_t
此結(jié)構(gòu)體用于配置HTTP/HTTPS參數(shù)
// 結(jié)構(gòu)體成員如下
typedef struct {
const char *url;//HTTP/HTTPS的url地址
const char *host;//域名或ip(此項(xiàng)可不填)
int port;//請(qǐng)求的端口80或443(默認(rèn)此項(xiàng)可不填)
const char *username;//用戶名用于HTTP身份驗(yàn)證(不用不填)
const char *password;//密碼用于HTTP身份驗(yàn)證(不用不填)
esp_http_client_auth_type_t auth_type;//HTTP身份驗(yàn)證類型默認(rèn)為HTTP_AUTH_TYPE_NONE即無(wú)身份驗(yàn)證(默認(rèn)即可)
const char *path;//HTTP路徑默認(rèn)為/(客戶端無(wú)需此項(xiàng))
const char *query;//HTTP查詢
const char *cert_pem;//服務(wù)器SSL證書(作為HTTPS服務(wù)器時(shí))
size_t cert_len;//證書長(zhǎng)度
const char *client_cert_pem;//客戶端SSL證書(作為客戶端,服務(wù)器需要驗(yàn)證證書時(shí))
size_t client_cert_len;//證書長(zhǎng)度
const char *client_key_pem;//客戶端證書密鑰
size_t client_key_len;//密鑰長(zhǎng)度
const char *client_key_password;//密鑰密碼
size_t client_key_password_len;//密碼長(zhǎng)度
const char *user_agent;//要與 HTTP 請(qǐng)求一起發(fā)送的用戶代理字符串
esp_http_client_method_t method;//請(qǐng)求模式默認(rèn)為HTTP_METHOD_GET即GET方法可根據(jù)需要進(jìn)行修改,也可以默認(rèn)不填請(qǐng)求時(shí)直接調(diào)用接口
int timeout_ms;//網(wǎng)絡(luò)超時(shí)時(shí)間
bool disable_auto_redirect;//禁用HTTP自動(dòng)重定向
int max_redirection_count;//最大重定向數(shù),如果為零,則使用默認(rèn)值
int max_authorization_retries;//接收 HTTP 未授權(quán)狀態(tài)代碼時(shí)的最大連接重試次數(shù),如果為零,則使用默認(rèn)值。如果 -1 則禁用授權(quán)重試
http_event_handle_cb event_handler;//HTTP事件回調(diào)函數(shù)(重要)
esp_http_client_transport_t transport_type;//HTTP傳輸類型使用HTTP時(shí)填HTTP_TRANSPORT_OVER_TCP,使用HTTPS時(shí)填HTTP_TRANSPORT_OVER_SSL
int buffer_size;//HTTP接收緩沖區(qū)大小(一般默認(rèn)即可)
int buffer_size_tx;//HTTP傳輸緩沖區(qū)大小
void *user_data;//HTTP user_data上下文
bool is_async;//設(shè)置異步模式,目前僅支持 HTTPS
bool use_global_ca_store;//
bool skip_cert_common_name_check;//跳過(guò)服務(wù)器證書 CN 字段的任何驗(yàn)證(注意此處有坑)
esp_err_t (*crt_bundle_attach)(void *conf);//指向esp_crt_bundle_attach的函數(shù)指針。允許使用證書捆綁包進(jìn)行服務(wù)器驗(yàn)證,必須在menuconfig中啟用
bool keep_alive_enable;//啟用保持活動(dòng)狀態(tài)超時(shí)
int keep_alive_idle;//保持活動(dòng)空閑時(shí)間。默認(rèn)值為 5(秒)
int keep_alive_interval;//保持活動(dòng)間隔時(shí)間。默認(rèn)值為 5(秒)
int keep_alive_count;//保持活動(dòng)狀態(tài)數(shù)據(jù)包重試發(fā)送計(jì)數(shù)。默認(rèn)值為 3 個(gè)計(jì)數(shù)
struct ifreq *if_name;//要通過(guò)的數(shù)據(jù)的接口的名稱。使用默認(rèn)界面而不設(shè)置
} esp_http_client_config_t;
設(shè)置HTTP/HTTPS請(qǐng)求方法
此接口可以手動(dòng)設(shè)置HTTP請(qǐng)求方式(可以覆蓋配置結(jié)構(gòu)體的設(shè)置)
//client為esp_http_client_init函數(shù)返回的結(jié)構(gòu)體對(duì)象
//method為需要設(shè)置的請(qǐng)求方式GET填HTTP_METHOD_GET,POST填HTTP_METHOD_POST,還有其它方式不一一列舉了,可以去這個(gè)枚舉類型里面看
//失敗返回ESP_ERR_INVALID_ARG
esp_err_t esp_http_client_set_method(esp_http_client_handle_t client, esp_http_client_method_t method)
設(shè)置請(qǐng)求頭(如果需要的話)
//client為esp_http_client_init函數(shù)返回的結(jié)構(gòu)體對(duì)象
//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)
設(shè)置請(qǐng)求內(nèi)容
此處為POST請(qǐng)求
//client為esp_http_client_init函數(shù)返回的結(jié)構(gòu)體對(duì)象
//data為傳輸?shù)臄?shù)據(jù)首地址
//len為數(shù)據(jù)長(zhǎng)度
//失敗返回ESP_FAIL
esp_err_t esp_http_client_set_post_field(esp_http_client_handle_t client, const char *data, int len)
發(fā)起HTTP/HTTPS請(qǐng)求
此接口默認(rèn)以阻塞方式發(fā)起請(qǐng)求
//client為esp_http_client_init函數(shù)返回的結(jié)構(gòu)體對(duì)象
//失敗返回ESP_FAIL
esp_err_t esp_http_client_perform(esp_http_client_handle_t client)
關(guān)閉鏈接
此函數(shù)放在最后調(diào)用,功能與esp_http_client_init相反文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-454823.html
//client為esp_http_client_init函數(shù)返回的結(jié)構(gòu)體對(duì)象
//失敗返回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:
//當(dāng)執(zhí)行過(guò)程中出現(xiàn)任何錯(cuò)誤時(shí),會(huì)發(fā)生此事件
ESP_LOGD(TAG, "HTTP_EVENT_ERROR");
break;
case HTTP_EVENT_ON_CONNECTED:
// 一旦 HTTP 連接到服務(wù)器,就不會(huì)執(zhí)行任何數(shù)據(jù)交換
break;
case HTTP_EVENT_HEADER_SENT:
// 將所有標(biāo)頭發(fā)送到服務(wù)器后發(fā)生此事件
break;
case HTTP_EVENT_ON_HEADER:
// 在接收從服務(wù)器發(fā)送的每個(gè)標(biāo)頭時(shí)發(fā)生
break;
case HTTP_EVENT_ON_DATA:
ESP_LOGI(TAG, "HTTP_EVENT_ON_DATA, len=%d", evt->data_len);
//在此處理HTTP請(qǐng)求返回的數(shù)據(jù)
break;
case HTTP_EVENT_ON_FINISH:
// 完成 HTTP 會(huì)話時(shí)發(fā)生
break;
case HTTP_EVENT_DISCONNECTED:
// 連接斷開(kāi)時(shí)發(fā)生此事件
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請(qǐng)求
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做為客戶端進(jìn)行HTTPS請(qǐng)求時(shí),如果不需要驗(yàn)證服務(wù)器證書也就是想跳過(guò)證書驗(yàn)證,
改constesp_http_client_config_t結(jié)構(gòu)體中skip_cert_common_name_check成員是沒(méi)有效果的。
他只會(huì)跳過(guò)檢查證書的CN而不是CA,不會(huì)跳過(guò)整個(gè)證書驗(yàn)證。
所以如果想跳過(guò)證書則需要在menuconfig里面修改ESP-TLS選項(xiàng),改為默認(rèn)跳過(guò)服務(wù)器證書如下圖文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-454823.html
到了這里,關(guān)于ESP32 HTTPS客戶端POST請(qǐng)求(跳過(guò)證書驗(yàn)證)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!