Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
Network
Webclient
基于官方 webclient 的 http client
发布于 2020-01-05 16:20:36 浏览:3018
订阅该版
该库简单的封装了官方的 webclient API (并未对文件的请求API进行封装,原因是这个API需要过多的内存) 创建该库的原因是因为官方的 webclient API 均是阻塞型的,会造成线程高延迟 (例如我的线程是屏幕的刷新) 该库提供以下 API 异步操作API: ```c /* -------------------------- Asynchronous API -------------------------- */ int http_get(const char *url, http_result_cb_t cb); int http_post(const char *url, const char *data, http_result_cb_t cb); int http_send(const char *url, const char *type, const char *data, http_result_cb_t cb); /* -------------------------- Asynchronous API -------------------------- */ ``` 异步API是创建了一个线程去执行的这个请求的,请求成功并且有数据返回的时候,才会调用回调函数(前提是你有提供回调函数) 例如: ```c char *ad_text; char *ad_text_color; void get_text_result_cb(char *buf, uint16_t len) { printf("len:%d
%s
", strlen(buf), buf); cJSON *json = cJSON_Parse(buf); cJSON *cotent = cJSON_GetObjectItem(json, "content"); cJSON *color = cJSON_GetObjectItem(json, "color"); char *content_str = cJSON_GetStringValue(cotent); char *color_str = cJSON_GetStringValue(color); printf("
content:%s
color:#%lx
", content_str, color_str); if (content_str) { if (ad_text) cJSON_free(ad_text); ad_text = content_str; } if (color_str) { if (ad_text_color) cJSON_free(ad_text_color); ad_text_color = color_str; } // #是作为颜色的结束标志,详细可以查看littlevGL官网文档 lv_label_set_text_fmt(label2, "%s %s#", ad_text_color, ad_text); } void get_text(void) { http_get("http://" URL ":" PORT "/ad?cmd=get", get_text_result_cb); } ``` 阻塞型的API: ```c /* -------------------------- synchronous API -------------------------- */ char* http_get_sync(const char *url); char* http_post_sync(const char *url, const char *data); char* http_sync(const char *url, const char *type, const char *data); /* -------------------------- synchronous API -------------------------- */ ``` 阻塞型API 是封装了官方的 webclient 的过程,请求成功并且有数据返回的会把返回一个缓冲区给你(这些API会申请与返回内容一样大的内存空间去存储它) 使用完之后记得要释放掉这个缓冲区,不然会造成内存溢出的哟。 并提供了一个低内存消耗的文件请求API: ```c char http_get_file(const char *url, const char *path, http_get_file_cb_t cb); ``` 例如: ```c extern void Jpeg_Dec_file(const char *path); #define IMAGE_FILE_NAME "image.jpeg" void get_image_cb(void) { Jpeg_Dec_file(IMAGE_FILE_NAME); // 解析jpeg文件并刷新到屏幕 } static void get_image(void) { http_get_file("http://" URL ":" PORT "/ad?cmd=get_image", "/" IMAGE_FILE_NAME, get_image_cb); } ``` 倘若你系统中没有挂载存储就不要使用这个 API 啦 以下是两个回调函数的定义: ```c typedef void (*http_result_cb_t)(char *buf, uint16_t len); typedef void (*http_get_file_cb_t)(void); ``` 以下是库文件,欢迎大家测试。 大家记得用完之后反馈下问题和使用感受哟。 ![http_client.h](/uploads/202001/05/161922jzxxiazqf0aaiiif.attach) ![http_client.c](/uploads/202001/05/161922oony74zovz0b7bda.attach) 上面两个例子展示: ``` \ | / - RT - Thread Operating System / | \ 4.0.3 build Jan 5 2020 2006 - 2019 Copyright by rt-thread team [0m[D/drv.sram] sram init success, mapped at 0x68000000, size is 1048576 bytes, data width is 16[0m [SFUD] Find a Winbond flash chip. Size is 16777216 bytes. [SFUD] W25Q128 flash device is initialize success. [32m[I/sal.skt] Socket Abstraction Layer initialize success.[0m LCD ID:1963 [32m[I/at.clnt] AT client(V1.3.0) on device uart3 initialize success.[0m msh />[32m[I/at.dev.esp] esp0 device wifi is connected.[0m [32m[I/at.dev.esp] esp0 device network initialize successfully.[0m [31m[E/at.clnt] execute command (AT+CIPDNS_CUR?) failed![0m [33m[W/at.dev.esp] please check and update esp0 device firmware to support the "AT+CIPDNS_CUR?" cmd.[0m [31m[E/at.clnt] execute command (AT+CIPDNS_CUR?) failed![0m [33m[W/at.dev.esp] please check and update esp0 device firmware to support the "AT+CIPDNS_CUR?" cmd.[0m last:0 Now:1578206928 len:253 {"content":"iu这些覅u上的覅速度和反思u发货是到付还是地方和但是fish的方式的好的放声大哭积分回馈圣诞节放假是东方航空技术的回复收到反馈说的的回复卡死的回复技术的开发","color":"#8080ff"} content:iu这些覅u上的覅速度和反思u发货是到付还是地方和但是fish的方式的好的放声大哭积分回馈圣诞节放假是东方航空技术的回复收到反馈说的的回复卡死的回复技术的开发 color:#2001bad0 [I/http.get.file] This file size is : 19.61Kb. 0% 3% 6% 10% 13% 16% 20% 23% 26% 30% 33% 36% 40% 43% 46% 50% 53% 56% 60% 63% 66% 70% 73% 76% 80% 83% 86% 90% 93% 96% OK ``` ![b1839a4f7dcf2da9cff7745e2499950.jpg](/uploads/202001/05/164331u38ih944cm813899.jpg)
查看更多
4
个回答
默认排序
按发布时间排序
achinwoo
2020-01-07
这家伙不懒,啥都会写
:)不错,学习了
昂头向前走
2020-01-07
这家伙很懒,什么也没写!
>不错,学习了 谢谢给个评价哈,兄弟
achinwoo
2020-01-08
这家伙不懒,啥都会写
但是目前的API好像POST还不支持二进制数据传输吧,好像要自己实现了
昂头向前走
2020-02-13
这家伙很懒,什么也没写!
>但是目前的API好像POST还不支持二进制数据传输吧,好像要自己实现了 不应该的吧,毕竟我都可以接收图片了。二进制的数据直接在接收数据的内容中,上传的话具体我也不清楚,我没有用到POST二进制数据到服务器,没有研究过这个问题,也没有仔细的去研究官方的代码是否支持二进制数据上传。 我的理解是,这个http请求返回的内容无论是二进制还是文本,我们读取的时候都是按uint8进行读取,也就是一个字符。那么我们处理的时候,究竟是把这数据当作是二进制内容还是文本内容都是自己决定的,如果你是自己提供服务的话,服务端也是一样的道理。 如果你POST了一个二进制数据,你可以看下服务端接收到的http消息头是否有二进制标志
achinwoo
2020-06-16
这家伙不懒,啥都会写
我看已经更新了,2020.13.31支持二进制了,更新版本V2.2.0,但是官网显示还是V2.1.2哦,希望官方尽快同步显示版本吧!同时发现一个问题。v2.0.0 正常,我猜测是url中有":"会引起错误。202,希望官方更新一下,解决一下这个BUG,因为老版本正常的。
achinwoo
2020-06-17
这家伙不懒,啥都会写
再跟一下贴,吐槽一下哦,我发现webclient的webclient_read支持`Transfer-Encoding: chunked` ,但是`webclient_write`不支持,希望官方能够改进一下。 毕竟`HTTPClientWriteData`支持chunk的。
撰写答案
登录
注册新账号
关注者
0
被浏览
3k
关于作者
昂头向前走
这家伙很懒,什么也没写!
提问
7
回答
12
被采纳
0
关注TA
发私信
相关问题
1
lwip1.4.1连接经常会断开无法连接上,可以ping通
2
LPC1768:RTT+LWIP+webserver用IE刷网页出现硬件中断错误(已经解决)
3
求一些LWIP开发的经验,目前ping一直不稳定。
4
stm32f207+dp83848无法ping通
5
RTT下的LWIP传递机制
6
rtt内lwip的socket是否是线程安全?
7
Lwip+enc28j60无法ping通
8
坑爹的rtconfig.h lwip关掉了checksum
9
花了一个晚上,把RT2.0的LWIP、网卡驱动、文件系统整合起来了,发现一点小问题
10
lwip例程中udp发送时如何指定源端口发送到指定目的地端口
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
最新文章
1
【RT-Thread】【ci】【scons】将ci.attachconfig.yml和scons结合使用
2
Rt-thread中OTA下载后,bootloader不搬程序
3
ulog 日志 LOG_HEX 输出时间改为本地日期时间
4
在RT-Thread Studio中构建前执行python命令
5
研究一了一段时间RTT,直接标准版上手太难,想用nano,但又舍不得组件
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
I2C_IIC
ESP8266
UART
WIZnet_W5500
ota在线升级
cubemx
PWM
flash
freemodbus
BSP
packages_软件包
潘多拉开发板_Pandora
定时器
ADC
flashDB
GD32
socket
编译报错
中断
Debug
rt_mq_消息队列_msg_queue
SFUD
msh
keil_MDK
ulog
C++_cpp
MicroPython
本月问答贡献
xusiwei1236
8
个答案
2
次被采纳
踩姑娘的小蘑菇
1
个答案
2
次被采纳
用户名由3_15位
9
个答案
1
次被采纳
bernard
4
个答案
1
次被采纳
RTT_逍遥
3
个答案
1
次被采纳
本月文章贡献
聚散无由
2
篇文章
15
次点赞
catcatbing
2
篇文章
5
次点赞
Wade
2
篇文章
4
次点赞
Ghost_Girls
1
篇文章
7
次点赞
xiaorui
1
篇文章
2
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部