外观
HTTP/HTTPS GET 请求示例
2025-10-29
本文将详细介绍如何在开发环境中创建 webclient_get 示例工程,并将其编译后在开发板上运行,最终通过 HTTP 或 HTTPS GET 请求访问网页并获取内容。帮助读者熟悉开发环境,掌握 HTTP/HTTPS GET 请求的基本用法及差异。
HTTP/HTTPS GET 请求的作用
HTTP(S) GET 请求是一种常见的 Web 通信方式,主要用于从指定服务器获取资源:
HTTP(HyperText Transfer Protocol):明文传输,适用于不涉及隐私或安全的数据访问;
HTTPS(HTTP Secure):在 HTTP 基础上增加了 TLS/SSL 加密层,用于保护数据传输的安全性,防止中间人攻击和数据泄露。
GET 请求常用于网页浏览、API 数据获取等场景,其使用简单、效率高,是嵌入式系统中常用的网络请求方式。
运行 HTTP/HTTPS GET 请求示例
本示例通过向指定网页发送 GET 请求,开发板接收响应数据并输出网页内容。可自由选择使用 HTTP 或 HTTPS 协议访问资源。
硬件连接
需将网卡 0 连接到公网,以保证开发板能正常访问外部网络。

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

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

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

创建完成。

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

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

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

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

固化 APP

核心示例代码
webclient get 示例相关 API
webclient_session_create: 创建 WebClient 会话,指定响应头缓冲区大小。若创建失败,返回内存不足错误;webclient_get:通过会话 session 向指定 uri 发送 GET 请求,并获取响应状态码;webclient_content_length_get:取响应内容的长度;webclient_read:通过会话 session 读取数据;
applications/webclient_get_example.c
#define GET_LOCAL_URI "http://www.rt-thread.com/service/rt-thread.txt"
static int webclient_get_comm(const char *uri)
{
struct webclient_session *session = RT_NULL;
unsigned char *buffer = RT_NULL;
int index, ret = 0;
int bytes_read, resp_status;
int content_length = -1;
buffer = (unsigned char *)web_malloc(GET_RESP_BUFSZ);
if (buffer == RT_NULL)
{
rt_kprintf("no memory for receive buffer.\n");
ret = (-RT_ENOMEM);
goto __exit;
}
/* create webclient session and set header response size */
session = webclient_session_create(GET_HEADER_BUFSZ);
if (session == RT_NULL)
{
ret = (-RT_ENOMEM);
goto __exit;
}
/* send GET request by default header */
if ((resp_status = webclient_get(session, uri)) != 200)
{
rt_kprintf(
"webclient GET request failed, response(%d) error.\n", resp_status);
ret = (-RT_ERROR);
goto __exit;
}
rt_kprintf("webclient get response data: \n");
content_length = webclient_content_length_get(session);
if (content_length < 0)
{
rt_kprintf("webclient GET request type is chunked.\n");
do
{
bytes_read =
webclient_read(session, (void *)buffer, GET_RESP_BUFSZ);
if (bytes_read <= 0)
{
break;
}
for (index = 0; index < bytes_read; index++)
{
rt_kprintf("%c", buffer[index]);
}
} while (1);
rt_kprintf("\n");
}
else
{
int content_pos = 0;
do
{
bytes_read = webclient_read(session, (void *)buffer,
content_length - content_pos > GET_RESP_BUFSZ ?
GET_RESP_BUFSZ :
content_length - content_pos);
if (bytes_read <= 0)
{
break;
}
for (index = 0; index < bytes_read; index++)
{
rt_kprintf("%c", buffer[index]);
}
content_pos += bytes_read;
} while (content_pos < content_length);
rt_kprintf("\n");
}
__exit:
if (session)
{
webclient_close(session);
session = RT_NULL;
}
if (buffer)
{
web_free(buffer);
}
return ret;
}
static int webclient_get_smpl(const char *uri)
{
char *response = RT_NULL;
size_t resp_len = 0;
int index;
if (webclient_request(
uri, RT_NULL, RT_NULL, 0, (void **)&response, &resp_len) < 0)
{
rt_kprintf("webclient send get request failed.");
return (-RT_ERROR);
}
rt_kprintf("webclient send get request by simplify request interface.\n");
rt_kprintf("webclient get response data: \n");
for (index = 0; index < strlen(response); index++)
{
rt_kprintf("%c", response[index]);
}
rt_kprintf("\n");
if (response)
{
web_free(response);
}
return 0;
}
int webclient_get_test(int argc, char **argv)
{
char *uri = RT_NULL;
if (argc == 1)
{
uri = web_strdup(GET_LOCAL_URI);
if (uri == RT_NULL)
{
rt_kprintf("no memory for create get request uri buffer.\n");
return (-RT_ENOMEM);
}
webclient_get_comm(uri);
}
else if (argc == 2)
{
if (strcmp(argv[1], "-s") == 0)
{
uri = web_strdup(GET_LOCAL_URI);
if (uri == RT_NULL)
{
rt_kprintf("no memory for create get request uri buffer.\n");
return (-RT_ENOMEM);
}
webclient_get_smpl(uri);
}
else
{
uri = web_strdup(argv[1]);
if (uri == RT_NULL)
{
rt_kprintf("no memory for create get request uri buffer.\n");
return (-RT_ENOMEM);
}
webclient_get_comm(uri);
}
}
else if (argc == 3 && strcmp(argv[1], "-s") == 0)
{
uri = web_strdup(argv[2]);
if (uri == RT_NULL)
{
rt_kprintf("no memory for create get request uri buffer.\n");
return (-RT_ENOMEM);
}
webclient_get_smpl(uri);
}
else
{
rt_kprintf("web_get_test [URI] - webclient GET request test.\n");
rt_kprintf(
"web_get_test -s [URI] - webclient simplify GET request test.\n");
return (-RT_ERROR);
}
if (uri)
{
web_free(uri);
}
return RT_EOK;
}如需体验 https 将webclient_get_example.c 文件中的 GET_LOCAL_URI 宏修改为 "https://www.rt-thread.com/service/rt-thread.txt"
applications/webclient_get_example.c
#define GET_LOCAL_URI "http://www.rt-thread.com/service/rt-thread.txt"
#define GET_LOCAL_URI "https://www.rt-thread.com/service/rt-thread.txt"运行示例
操作步骤
设置网络参数
- 设置 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测试 GET 请求
在完成网络参数设置后,输入以下命令测试 GET 请求:
msh />web_get_test webclient get response data: RT-Thread is an open source IoT operating system from China, which has strong scalability: from a tiny kernel running on a tiny core, for example ARM Cortex-M0, or Cortex-M3/4/7, to a rich feature system running on MIPS32, ARM Cortex-A8, ARM Cortex-A9 DualCore etc.
添加新的证书
为什么需要添加新的证书?
默认情况下,RT-Thread 的 webclient 组件仅支持部分服务商的证书,如果需要使用其他服务商的证书,需要添加新的证书。
当出现[tls]verification info: ! The CRL is not correctly signed by the trusted CA 就表示证书验证失败,需要添加新的证书。
如何添加新的证书?
CA 证书有两种常用格式 PEM 格式 和 DER 格式,目前 RT-Thread mbedtls 仅支持 PEM 格式 的证书文件。
PEM 格式证书 通常是以 .pem 和 .cer 后缀名结尾的文件。
使用文本编辑器打开后,文件内容以 -----BEGIN CERTIFICATE----- 开头,以 -----END CERTIFICATE----- 结尾。
根证书样式
双击 .cer 后缀名结尾的 CA 文件(Windows 系统)可以看到证书的签发机构和有效期,如下图所示:

PEM 格式 格式的证书文件内容内容样式如下所示:
-----BEGIN CERTIFICATE-----
MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkG
A1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jv
b3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAw
MDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9i
YWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJHbG9iYWxT
aWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDaDuaZ
jc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavp
xy0Sy6scTHAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp
1Wrjsok6Vjk4bwY8iGlbKk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdG
snUOhugZitVtbNV4FpWi6cgKOOvyJBNPc1STE4U6G7weNLWLBYy5d4ux2x8gkasJ
U26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrXgzT/LCrBbBlDSgeF59N8
9iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8E
BTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0B
AQUFAAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOz
yj1hTdNGCbM+w6DjY1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE
38NflNUVyRRBnMRddWQVDf9VMOyGj/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymP
AbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhHhm4qxFYxldBniYUr+WymXUad
DKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveCX4XSQRjbgbME
HMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A==
-----END CERTIFICATE-----获取根证书
直接向服务商索取
向服务商索取
base64 编码 X.509编码的 PEM 格式 证书文件。从服务商网站导出
- 浏览器打开服务商网站,以
https://www.rt-thread.org/为例 - 点击浏览器地址栏的 安全,然后点击证书,并查看证书详细信息


- 选择导出 Base64 编码根证书


- 选择证书存储位置


完成证书导出,证书文件名为 rtthread-cer-base64.cer。
- 浏览器打开服务商网站,以
导入证书
- 拷贝 rtthread-cer-base64.cer 文件到
rt-thread\components\security\mbedtls\certs\根目录
rt-thread
components
security
mbedtls
certs
rtthread-cer-base64.cer
- 重新编译
