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对应的状态值,详见下表
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格式。