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 a;
if (m==3){
a=wifi_getinfo(3); echo(" \r\nDLen="+a);
a=wifi_getinfo(4); echo(" \r\nDsize="+a);
a=wifi_getinfo(21);echo(" \r\nhttperrid="+a);
a=wifi_getinfo(22);echo(" \r\nhttpstatus="+a);
echo("\r\n");
//wifi_httpget
s=wifi_getinfo(12); //获取下载内容
echo(s);
m1.text=s;
}
}
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格式。