外观
HTTP/HTTPS POST 示例
2025-10-29
本文介绍了如何在开发环境中创建一个 webclient_post 示例工程,并将其编译后在开发板上运行,实现通过 HTTP 或 HTTPS POST 请求 向指定服务器提交数据的功能。旨在帮助读者进一步熟悉开发环境,掌握 HTTP/HTTPS POST 请求的使用方法及其配置要点。
HTTP/HTTPS POST 请求的作用
HTTP POST 请求是 Web 通信中最常用的一种方法,主要作用是向服务器提交数据。区别于 GET 请求,POST 请求会将数据封装在 请求体中 发送,适合传输结构化、敏感、或较大的数据内容。
HTTP POST:明文传输,适合用于本地调试、非敏感数据;
HTTPS POST:基于 TLS/SSL 加密协议,可加密传输数据,保障通信安全,适合在线服务、敏感信息交互。
常见应用包括:表单提交、设备上报信息、物联网云平台对接等。
本示例以演示如何通过 HTTP(S) POST 请求向指定服务器提交数据,并接收服务器响应为实践目标,实现向服务器发送请求,获取服务器返回信息的演示效果。
硬件连接
将开发板网口连接到路由器。

创建工程点击展开
依次点击 “文件” -> “新建” -> "RT-Thread RuiChing App 项目"。

在弹出新建向导中选择 开发版 、BSP: 、示例 、 调试器/下载器。选择好之后点击 “完成”。

点击 “完成” 后,等待工程创建完成。

创建完成。

构建工程点击展开
单击工程使工程进入 Active-Debug 模式。

点击工具栏上的构建按钮进行工程编译。

构建成功后,会显示构建成功的信息。

固件下载点击展开
固化设备树

固化 APP

核心示例代码
webclient post 示例相关 API
webclient_session_create:创建 WebClient 会话,设置响应头缓冲区大小,若创建失败则返回内存不足错误;webclient_request_header_add: 添加 Content-Length 和 Content-Type 请求头;webclient_post:发送 POST 请求,若响应状态码不为 200,则打印错误信息并返回错误;webclient_read: 循环读取响应数据,直到读取完所有数据,并将其逐个字符打印出来;
applications/webclient_post_example.c
#define POST_LOCAL_URI "http://www.rt-thread.com/service/echo"
const char *post_data =
"RT-Thread is an open source IoT operating system from China!";
/* send HTTP POST request by common request interface, it used to receive longer data */
static int webclient_post_comm(
const char *uri, const void *post_data, size_t data_len)
{
struct webclient_session *session = RT_NULL;
unsigned char *buffer = RT_NULL;
int index, ret = 0;
int bytes_read, resp_status;
buffer = (unsigned char *)web_malloc(POST_RESP_BUFSZ);
if (buffer == RT_NULL)
{
rt_kprintf("no memory for receive response buffer.\n");
ret = (-RT_ENOMEM);
goto __exit;
}
/* create webclient session and set header response size */
session = webclient_session_create(POST_HEADER_BUFSZ);
if (session == RT_NULL)
{
ret = (-RT_ENOMEM);
goto __exit;
}
/* build header for upload */
webclient_header_fields_add(
session, "Content-Length: %d\r\n", strlen(post_data));
webclient_header_fields_add(session,
"Content-Type: application/octet-stream \
\r\n");
/* send POST request by default header */
if ((resp_status = webclient_post(session, uri, post_data, data_len)) !=
200)
{
rt_kprintf("webclient POST request failed, response(%d) error.\n",
resp_status);
ret = -RT_ERROR;
goto __exit;
}
rt_kprintf("webclient post response data: \n");
do
{
bytes_read = webclient_read(session, buffer, POST_RESP_BUFSZ);
if (bytes_read <= 0)
{
break;
}
for (index = 0; index < bytes_read; index++)
{
rt_kprintf("%c", buffer[index]);
}
} while (1);
rt_kprintf("\n");
__exit:
if (session)
{
webclient_close(session);
session = RT_NULL;
}
if (buffer)
{
web_free(buffer);
}
return ret;
}
static int webclient_post_smpl(
const char *uri, const char *post_data, size_t data_len)
{
char *response = RT_NULL;
char *header = RT_NULL;
size_t resp_len = 0;
int index = 0;
webclient_request_header_add(
&header, "Content-Length: %d\r\n", strlen(post_data));
webclient_request_header_add(&header,
"Content-Type: application/octet-stream \
\r\n");
if (webclient_request(uri, header, post_data, data_len, (void **)&response,
&resp_len) < 0)
{
rt_kprintf("webclient send post request failed.");
web_free(header);
return (-RT_ERROR);
}
rt_kprintf("webclient send post request by simplify request interface.\n");
rt_kprintf("webclient post response data: \n");
for (index = 0; index < resp_len; index++)
{
rt_kprintf("%c", response[index]);
}
rt_kprintf("\n");
if (header)
{
web_free(header);
}
if (response)
{
web_free(response);
}
return 0;
}
int webclient_post_test(int argc, char **argv)
{
char *uri = RT_NULL;
if (argc == 1)
{
uri = web_strdup(POST_LOCAL_URI);
if (uri == RT_NULL)
{
rt_kprintf("no memory for create post request uri buffer.\n");
return (-RT_ENOMEM);
}
webclient_post_comm(uri, (void *)post_data, strlen(post_data));
}
else if (argc == 2)
{
if (strcmp(argv[1], "-s") == 0)
{
uri = web_strdup(POST_LOCAL_URI);
if (uri == RT_NULL)
{
rt_kprintf("no memory for create post request uri buffer.\n");
return (-RT_ENOMEM);
}
webclient_post_smpl(uri, (void *)post_data, strlen(post_data));
}
else
{
uri = web_strdup(argv[1]);
if (uri == RT_NULL)
{
rt_kprintf("no memory for create post request uri buffer.\n");
return (-RT_ENOMEM);
}
webclient_post_comm(uri, (void *)post_data, strlen(post_data));
}
}
else if (argc == 3 && strcmp(argv[1], "-s") == 0)
{
uri = web_strdup(argv[2]);
if (uri == RT_NULL)
{
rt_kprintf("no memory for create post request uri buffer.\n");
return (-RT_ENOMEM);
}
webclient_post_smpl(uri, (void *)post_data, strlen(post_data));
}
else
{
rt_kprintf("web_post_test [uri] - webclient post request test.\n");
rt_kprintf(
"web_post_test -s [uri] - webclient simplify post request test.\n");
return (-RT_ERROR);
}
if (uri)
{
web_free(uri);
}
return RT_EOK;
}如需体验 https 将webclient_post_example.c 文件中的 GET_LOCAL_URI 宏修改为 "https://www.rt-thread.com/service/echo"
webclient_post_example.c
#define GET_LOCAL_URI "http://www.rt-thread.com/service/echo"
#define GET_LOCAL_URI "https://www.rt-thread.com/service/echo"运行示例
操作步骤
- 设置 IP 地址:将 IP 地址替换为自己网络的实际 IP 地址。
msh />ifconfig e0 10.23.8.38 10.23.8.254 255.255.255.0
config : e0
IP addr: 10.23.8.38
Gateway: 10.23.8.254
netmask: 255.255.255.0- 设置 DNS 服务器:将 DNS 服务器替换为自己网络的实际 DNS 服务器地址。
msh />dns e0 0 223.5.5.5
set network interface device(e0) dns server #0: 223.5.5.5- 执行 POST 请求测试
msh />web_post_test
method 2
webclient post response data:
RT-Thread is an open source IoT operating system from China!