esp32 multipart/form-data(一)

记录如何在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

猜你喜欢

转载自blog.csdn.net/taotf/article/details/128290068