记录如何在esp32上使用http post multipart/form-data类型数据
写的比较乱,以后再整理。
项目中要在esp32上用http post一个multipart/form-data类型的数据,于是自己研究了一下http,记录一下实现的过程。
先用wireshark中抓包查看postman是如何发送数据的
1、首先在postman中发送一次
其中ciphertext为加密后base64编码数据,file是一个txt文件内容是456
2、Wireshark抓包如下图:
整体的formdata如下所示
3、esp32实现过程
根据以上抓包可以看到如何设置Content-Type和body内容。
3.1、设置Content-Type时加上boundary(边界)
在esp32中,代码如下:
//set Content-Type:multipart/form-data
esp_http_client_set_header(client, "Content-Type", "multipart/form-data; boundary=--------------------------829388784102783270881754\r\n");
其中"--------------------------829388784102783270881754\r\n"表示边界类型,可自定义。
3.2、formdata的内容
在postman中只有两段
ciphertext对应的数据是加密后base64编码数据Sfo4LaU/lXK0PPwvC6AtUg4NW7D2C07znPDrOP88vcun86abTD+qV/yp+rO3MvPIzWNrKm3NVzybtpzuqZtmVhFlvwgAF4rWSkcov/9maEQ=
file对应的数据是一个txt文件内容是456
multipart/form-data请求请求体的格式
--${
boundary}
...
--${
boundary}
...
--${
boundary}--
之前没看懂的格式,通过抓包便里面理解了。
在嵌入式esp32中需要以下内容描述
//boundary=--------------------------829388784102783270881754
----------------------------829388784102783270881754\r\n
Content-Disposition: form-data; name="ciphertext"\r\n\r\n
Sfo4LaU/lXK0PPwvC6AtUg4NW7D2C07znPDrOP88vcun86abTD+qV/yp+rO3MvPIzWNrKm3NVzybtpzuqZtmVhFlvwgAF4rWSkcov/9maEQ=\r\n
----------------------------829388784102783270881754\r\n
Content-Disposition: form-data; name="file"; filename="123.txt"\r\n
Content-Type: text/plain\r\n\r\n
456\r\n
----------------------------829388784102783270881754--\r\n
4、esp32的代码实现
将3.2节formdata的内容转十六进制,简单粗暴,如下
扫描二维码关注公众号,回复:
14744675 查看本文章
char post_data1[1024] = {
0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d
,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x38,0x32,0x39,0x33
,0x38,0x38,0x37,0x38,0x34,0x31,0x30,0x32,0x37,0x38,0x33,0x32,0x37,0x30,0x38,0x38
,0x31,0x37,0x35,0x34,0x0d,0x0a,0x43,0x6f,0x6e,0x74,0x65,0x6e,0x74,0x2d,0x44,0x69
,0x73,0x70,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x3a,0x20,0x66,0x6f,0x72,0x6d,0x2d
,0x64,0x61,0x74,0x61,0x3b,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x63,0x69,0x70,0x68
,0x65,0x72,0x74,0x65,0x78,0x74,0x22,0x0d,0x0a,0x0d,0x0a,0x53,0x66,0x6f,0x34,0x4c
,0x61,0x55,0x2f,0x6c,0x58,0x4b,0x30,0x50,0x50,0x77,0x76,0x43,0x36,0x41,0x74,0x55
,0x67,0x34,0x4e,0x57,0x37,0x44,0x32,0x43,0x30,0x37,0x7a,0x6e,0x50,0x44,0x72,0x4f
,0x50,0x38,0x38,0x76,0x63,0x75,0x6e,0x38,0x36,0x61,0x62,0x54,0x44,0x2b,0x71,0x56
,0x2f,0x79,0x70,0x2b,0x72,0x4f,0x33,0x4d,0x76,0x50,0x49,0x7a,0x57,0x4e,0x72,0x4b
,0x6d,0x33,0x4e,0x56,0x7a,0x79,0x62,0x74,0x70,0x7a,0x75,0x71,0x5a,0x74,0x6d,0x56
,0x68,0x46,0x6c,0x76,0x77,0x67,0x41,0x46,0x34,0x72,0x57,0x53,0x6b,0x63,0x6f,0x76
,0x2f,0x39,0x6d,0x61,0x45,0x51,0x3d,0x0d,0x0a,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d
,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d
,0x2d,0x2d,0x2d,0x2d,0x2d,0x38,0x32,0x39,0x33,0x38,0x38,0x37,0x38,0x34,0x31,0x30
,0x32,0x37,0x38,0x33,0x32,0x37,0x30,0x38,0x38,0x31,0x37,0x35,0x34,0x0d,0x0a,0x43
,0x6f,0x6e,0x74,0x65,0x6e,0x74,0x2d,0x44,0x69,0x73,0x70,0x6f,0x73,0x69,0x74,0x69
,0x6f,0x6e,0x3a,0x20,0x66,0x6f,0x72,0x6d,0x2d,0x64,0x61,0x74,0x61,0x3b,0x20,0x6e
,0x61,0x6d,0x65,0x3d,0x22,0x66,0x69,0x6c,0x65,0x22,0x3b,0x20,0x66,0x69,0x6c,0x65
,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x31,0x32,0x33,0x2e,0x74,0x78,0x74,0x22,0x0d,0x0a
,0x43,0x6f,0x6e,0x74,0x65,0x6e,0x74,0x2d,0x54,0x79,0x70,0x65,0x3a,0x20,0x74,0x65
,0x78,0x74,0x2f,0x70,0x6c,0x61,0x69,0x6e,0x0d,0x0a,0x0d,0x0a,0x34,0x35,0x36,0x0d
,0x0a,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d
,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x38,0x32,0x39
,0x33,0x38,0x38,0x37,0x38,0x34,0x31,0x30,0x32,0x37,0x38,0x33,0x32,0x37,0x30,0x38
,0x38,0x31,0x37,0x35,0x34,0x2d,0x2d,0x0d,0x0a};
post_data1的内容就是body,然后调用esp_http_client_set_post_field设置body:
esp_http_client_set_post_field(client, post_data1, strlen(post_data1));
最后在贴一下整体的代码
void http_test_form_data()
{
esp_http_client_config_t config = {
.url = "http://****************/timely/cateye/log/device-active",
.event_handler = _http_event_handler,
};
esp_http_client_handle_t client = esp_http_client_init(&config);
char post_data1[1024] = {
0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d
,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x38,0x32,0x39,0x33
,0x38,0x38,0x37,0x38,0x34,0x31,0x30,0x32,0x37,0x38,0x33,0x32,0x37,0x30,0x38,0x38
,0x31,0x37,0x35,0x34,0x0d,0x0a,0x43,0x6f,0x6e,0x74,0x65,0x6e,0x74,0x2d,0x44,0x69
,0x73,0x70,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x3a,0x20,0x66,0x6f,0x72,0x6d,0x2d
,0x64,0x61,0x74,0x61,0x3b,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x63,0x69,0x70,0x68
,0x65,0x72,0x74,0x65,0x78,0x74,0x22,0x0d,0x0a,0x0d,0x0a,0x53,0x66,0x6f,0x34,0x4c
,0x61,0x55,0x2f,0x6c,0x58,0x4b,0x30,0x50,0x50,0x77,0x76,0x43,0x36,0x41,0x74,0x55
,0x67,0x34,0x4e,0x57,0x37,0x44,0x32,0x43,0x30,0x37,0x7a,0x6e,0x50,0x44,0x72,0x4f
,0x50,0x38,0x38,0x76,0x63,0x75,0x6e,0x38,0x36,0x61,0x62,0x54,0x44,0x2b,0x71,0x56
,0x2f,0x79,0x70,0x2b,0x72,0x4f,0x33,0x4d,0x76,0x50,0x49,0x7a,0x57,0x4e,0x72,0x4b
,0x6d,0x33,0x4e,0x56,0x7a,0x79,0x62,0x74,0x70,0x7a,0x75,0x71,0x5a,0x74,0x6d,0x56
,0x68,0x46,0x6c,0x76,0x77,0x67,0x41,0x46,0x34,0x72,0x57,0x53,0x6b,0x63,0x6f,0x76
,0x2f,0x39,0x6d,0x61,0x45,0x51,0x3d,0x0d,0x0a,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d
,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d
,0x2d,0x2d,0x2d,0x2d,0x2d,0x38,0x32,0x39,0x33,0x38,0x38,0x37,0x38,0x34,0x31,0x30
,0x32,0x37,0x38,0x33,0x32,0x37,0x30,0x38,0x38,0x31,0x37,0x35,0x34,0x0d,0x0a,0x43
,0x6f,0x6e,0x74,0x65,0x6e,0x74,0x2d,0x44,0x69,0x73,0x70,0x6f,0x73,0x69,0x74,0x69
,0x6f,0x6e,0x3a,0x20,0x66,0x6f,0x72,0x6d,0x2d,0x64,0x61,0x74,0x61,0x3b,0x20,0x6e
,0x61,0x6d,0x65,0x3d,0x22,0x66,0x69,0x6c,0x65,0x22,0x3b,0x20,0x66,0x69,0x6c,0x65
,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x31,0x32,0x33,0x2e,0x74,0x78,0x74,0x22,0x0d,0x0a
,0x43,0x6f,0x6e,0x74,0x65,0x6e,0x74,0x2d,0x54,0x79,0x70,0x65,0x3a,0x20,0x74,0x65
,0x78,0x74,0x2f,0x70,0x6c,0x61,0x69,0x6e,0x0d,0x0a,0x0d,0x0a,0x34,0x35,0x36,0x0d
,0x0a,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d
,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x38,0x32,0x39
,0x33,0x38,0x38,0x37,0x38,0x34,0x31,0x30,0x32,0x37,0x38,0x33,0x32,0x37,0x30,0x38
,0x38,0x31,0x37,0x35,0x34,0x2d,0x2d,0x0d,0x0a ,0};//最后加个0方便strlen长度
esp_http_client_set_method(client, HTTP_METHOD_POST);
esp_http_client_set_header(client, "deviceId", "Slock383B26942336");
esp_http_client_set_header(client, "Content-Type", "multipart/form-data; boundary=--------------------------829388784102783270881754\r\n");
esp_http_client_set_post_field(client, post_data1, strlen(post_data1));
esp_err_t err = esp_http_client_perform(client);
if (err == ESP_OK) {
ESP_LOGI(TAG, "HTTP POST 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));
}
esp_http_client_cleanup(client);
}
参考:
multipart/form-data (一种POST 数据提交的方式)链接: https://blog.csdn.net/dreamerrrrrr/article/details/111146763