http协议下载一个页面字符串
支持芯片: ESP32-S3系列void wifi_httpget(str url);
//url: 访问页面的而URL
本函数是一个异步调用函数,wifi_httpget()被调用后,会立即向后执行,在获取信息后,会调用void app.onWIFI32(int m);判断m==3后就可以通过wifi_getinfo来获取结果
由于本系统只能处理最大1024字节的字符串,因此页面字符串最大长度也只有1024字节,超过会自动截取。
示例
class s3=loadcom(skinbutton);
void app.onWIFI32(int m){
str s;
int isbin;
if (m==3){
isbin=wifi_getinfo(8);
if (isbin==0){
//wifi_httpget
s=wifi_getinfo(12); //从默认下载区获取下载的字符串
echo(s);
}else{
//wifi_httpdnbin 下载的二进制数据
}
}
}
void s3.onclick()
{
wifi_httpget("http://a-diy.cn/");
}
start();
wifi_getinfo对应的功能表:
编号 | 内容 | 返回 | 描述 |
---|---|---|---|
0 | wifi_m | int | WIFI事件编号,即app.onWIFI32(int m)中的m,本函数中==3 |
2 | msgnum | int | 消息编号,详见下表 |
3 | p1 | int | 下载内容长度,本参数是服务器端传回的长度 |
4 | p2 | int | 实际下载长度 |
5 | url | str | http下载的url |
12 | dn | str | 从psram中的下载区转换成字符串返回 |
13 | defdnaddr | int | 获取系统默认的dn位置的addr,对应psram |
14 | defupaddr | int | 获取系统默认的post位置的addr,对应psram |
15 | dnmaxsize | int | 获取系统默认的dn下载区尺寸 |
16 | upmaxsize | int | 获取系统默认的post上传区尺寸 |
17 | dnaddr | int | 获取实际的dn下载addr |
18 | upaddr | int | 获取实际的post上传区addr |
19 | dnsize | int | 获取已经下载的内容尺寸大小 |
21 | d1 | int | httperrid对应的错误值,详见下表 |
22 | d2 | int | httpstatus对应的状态值,详见下表 |
- 只列有关项目,以上参数只有在nWIFI32事件中调用方能获取正确值
httperrid对应的错误值
错误码 | 情况 |
---|---|
0 | 无错误 |
0x8001 | 无网络 |
0x8001 | 域名不存在或DNS服务不通 |
0x8006 | 无法连接服务器 |
httpstatus对应的状态值
状态码 | 情况 |
---|---|
200 | 正常下载成功 |
404 | 页面url不存在,但服务器会返回404页面,因此仍会调用onWIFI32()事件 |
有关URL合成的问题
对于一个url来说,传入的参数是需要经过转义的,比如url中参数是通过&来分割的,那么当参数含有&这种特殊字符的时候,就会影响整个url的解析,比如:
http://shmictrl.com/?sn=参数sn
//当参数sn="123&b=5"这个字符串的时候,合成为:
http://shmictrl.com/?sn=123&b=5
//于是解析就会出错,会解出一个新的参数b,不仅参数错误,而且可能有安全漏洞
于是,按照互联网的规范,所有的参数都需要经过urlencode函数,该函数可以将特殊字符转换成%XX的格式加入进去,于是在我们这个系统中,合成URL请参见下面代码示例:
str url="http://a-diy.cn/demo.php?sn=";
url=url+app.urlencode(s2.text)+"&name=";
url=url+app.urlencode(s3.text)+"&tel=";
url=url+app.urlencode(s4.text);
echo(url);
wifi_httpget(url);
其中需要在appbase全局控件代码中增加urlencode函数,具体函数内容如下:
str urlencode(str s){
//合成url时用的函数,可以把特殊字符和汉字转成%XX的格式
str us=" &!#$%+@:=?";
str o="";
int i;
int c;
int len;
len=strlen(s);
for (i=0;i<len;i++){
c=asc(s,i);
if (strpos(us,substr(s,i,1)>=0)){
o=o+"%"+int2hex(c,2);
}else{
if (c>=128){
o=o+"%"+int2hex(c,2);
}else{
o=o+chr(c);
}
}
}
return o;
}
由于本系统使用的是GB2312内码,因此为了可靠起见,以上函数对于汉字也转换成%XX格式。