微信小程序Cannot read property ‘setData‘ of undefined,that=this_纳萨斯瓦德的博客-CSDN博客

mikel阅读(260)

来源: 微信小程序Cannot read property ‘setData‘ of undefined,that=this_纳萨斯瓦德的博客-CSDN博客

问题:Cannot read property ‘setData’ of undefined

原因分析:在wx.request({});方法的回调函数中,有时候需要使用this.setData将拿到的数据给到data中。在JavaScript中,this代表着当前对象,而在在wx.request({});方法的回调函数中,对象已经发生改变,this已经不是wx.request({});方法对象了,data属性也不复存在.

解决办法:在wx.request({});方法外复制一份this对象赋给that,在回调函数中使用that来代替this

onLoad: function () {
var that = this//这里就是解决办法
wx.request({
url: ‘https://miniapp.sjw2l3.com/test’,
method: ‘GET’,
data: {
},
success :(res)=> {
// console.log(res.data)
//使用that给data里面的数组赋值
that.setData({
localdata:res.data
})
console.log(this.data.localdata)
}
})
}

————————————————
版权声明:本文为CSDN博主「纳萨斯瓦德」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_43922093/article/details/108428716

WordPress网站宝塔启用Redis配置缓存加速,提升网站打开速度。_红客科技的博客-CSDN博客_宝塔使用redis

mikel阅读(276)

来源: WordPress网站宝塔启用Redis配置缓存加速,提升网站打开速度。_红客科技的博客-CSDN博客_宝塔使用redis

WordPress功能很强大,但是性能确实比较慢, WordPress采用的是动态数据库查询技术。通俗的说,就是用户访问每篇文章或页面,都会向数据库发送一条查询命令,数据库根据命令查询之后,返回查询结果(这个结果不考虑任何缓存技术)。显然,如果访问量大的时候,会出现频繁的查询。所以这会减慢网站速度。如果服务器性能不高,瞬间网站就崩溃了。

所以需要一种技术,来减少数据库查询次数。而数据库缓存技术就是其中之一。Redis技术是其中的佼佼者。Redis是key-value分布式存储系统。简单的说,就是根据关键词值进行查询,这在很大程度上弥补了Memcached的短板。通过Redis进行数据库缓存,查询速度会更快,并发数更多。

本次教程使用宝塔面板,后台的软件管理里面就可以直接安装Redis,不用去ssh下面敲命令来下载安装,提供的这种方法,更适合小白,毕竟谁都不是大神,用最简单的方法,让我们的博客变的飞起来,那何乐而不为呢。

第一:安装Redis扩展

安装过程也是很快的,稍等会安装好了,Redis是一个高级的key-value存储系统,类似memcached,所有内容都存在内存中,因此每秒钟可以超过10万次GET操作。如果流量很大的站我们可以用在redis缓存来解决流量太大给服务器带来的压力。

 

wordpress安装Redis缓存教程
请勿安装同等类型的内存缓存。比如Memcached,可能会出现冲突。

宝塔面板安装Redis缓存插件
面板 – 软件商店 – PHP – 设置 – 安装扩展 – redis
wordpress安装“Redis Object Cache”
WP后台 – 插件 – 安装插件 – 搜“Redis Object Cache”安装并启用
网站根目录wp-config.php中增加:
define( ‘WP_CACHE_KEY_SALT’, ‘Redis123’ );

Redis123为任意字符,推荐以你的数据库名称,并且如果一个网站有多个WordPress使用Redis的话,需要每个网站设置的Redis123都不同。

配置redis插件
WP后台 – 设置 – Redis – Enable Object Cache 。
Status显示为 Connected 代表插件启用成功。

测试Redis缓存效果
随便打开前台几个页面。然后到宝塔面板查看 面板 – 软件商店 – Redis – 设置 – 负载状态。

比如:hit 90.91 (该数值随着使用会不断增高)

缓存命中率非常高。提高网站服务器几个数量级的性能。

 

打开网站首页右键查看源码,拉到最底部也能看到开启Redis情况。

 

开启Redis后打开网站SQL查询可以减少一半,比如用日主题搭建资源站,开启Redis后打开主页SQL查询在70左右。不开启正常在140左右,打开网站首页速度非常慢。

新手不开启Redis密码等其他参数设置,宝塔里面安装完Redis和网站安装好插件开启就行。

WordPress网站宝塔启用Redis配置缓存加速,提升网站打开速度。 – 红客科技
————————————————
版权声明:本文为CSDN博主「红客科技」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weizuer123/article/details/126324108

微信小程序路由跳转详情_Tx的练习题的博客-CSDN博客_微信小程序路由跳转

mikel阅读(276)

1.路由跳转
微信小程序的路由跳转 是通过两个栈堆实现的,这就导致了栈堆里最多储存十个页面,如果超过十个,会直接报错,所以要在必要的时候清空栈堆。

wx.navigateTo:最常用的跳转,跳转到另一个页面,并把当前页面存在栈堆里,缺点是会有十个限制,优点是回退的时候非常顺滑,页面直接联系紧密或者非常繁杂的页面跳转的时候推荐使用。

wx.switchTab:跳转到 tabBar 页面,并关闭其他所有非 tabBar 页面,清空栈堆的方法之一,但局限性比较大。

wx.reLaunch:关闭所有的页面,打开到应用内的某个页面,清空栈堆的方法之一,可以一次性清空所有栈堆,但是二次加载的时候没有wx.navigateTo顺滑,非常影响体验。

wx.redirectTo:关闭当前页面,跳转到指定的某个页面,也是清栈堆的方法之一,页面联系的不紧密,不需要用户返回页面可以使用。一般来说可以用这个解决掉页面之间交互频繁栈堆爆满的问题。

wx.navigateBack:关闭当前页面,返回上一页面或多级页面。可通过 getCurrentPages 获取当前的页面栈,决定需要返回几层,跟wx.redirectTo的区别在于他只会跳到页面栈里有的栈,常用返回,非常好用,很简单解决双页面频繁交互问题。

顺带一提,页面传参:
当只有单个数据的时候:

var id=2
wx.navigateTo({
url: ‘/packageWF/estimate/estimate?id=’+id,
})

接收:

onLoad: function (options) {
this.setData({
sign:options.id
})
},

如果你传的值是boolena,int等数据都会被转换成字符串,接收的时候记得转换。

如果有大量数据的时候,创建一个对象,塞到对象里,使用JSON.stringify()转换成字符串发过去

wx.redirectTo({
url: ‘/package/ClockIn/Diet?tlist=’+JSON.stringify(this.data.tlist)
})

接收同理 用JSON.parse()转换拆出来就好。
————————————————
版权声明:本文为CSDN博主「Tx的练习题」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/txtop/article/details/123354253

解决微信小程序sessionid不一致的问题_Jeson是只程序猿的博客-CSDN博客_微信 sessionid

mikel阅读(405)

解决办法:

当小程序访问微信服务器的时候,微信服务器再访问我们的后台,最后在返回的报文里有微信服务器给小程序的sessionId,我们将这个sessionId进行利用微信小程序进行本地存储,当小程序在请求我们后台的接口的时候就能对比上了。

操作步骤:

①:找到返回的报文里sessionId数据

②:把这个Set-Cookie进行本地存储localstroage或者存储到一个全局变量里,以便后边调用。

       需要注意的是,在把Set-Cookie进行本地存储时,一定要先清除。

 
  1. // 请求成功响应的回调
  2. success: (result) => {
  3. //清除sessionId,否则res.header['Set-Cookie']会报错
  4. wx.removeStorageSync('sessionid');
  5. wx.setStorageSync("sessionid", result.header["Set-Cookie"]);
  6. }

设置成功之后,就会在本地存储中显示。

æ¬å°å­å¨cookieçå¼

③:最后一步,在进行页面的请求时,在请求头header里加上你存储的这个Set-Cookie的值。

小程序保存服务端sessionid的方法_m0_52813455的博客-CSDN博客_小程序有sessionid吗

mikel阅读(239)

普通的Web开发,都是把sessionid保存在cookie中传递的。
不管是java还是php,服务端的会在response的header中加上Set-Cookie

Response Headers
Content-Type:application/json;charset=UTF-8
Date:Mon, 02 Apr 2018 16:02:42 GMT
Set-Cookie:JSESSIONID=781C7F500DFA24D663BA243A4D9044BC;path=/yht;HttpOnly
浏览器的请求也会在header中加上

Request Headers
Accept:/
Accept-Encoding:gzip, deflate, br
Accept-Language:zh-CN,zh;q=0.8
Cache-Control:no-cache
Connection:keep-alive
Content-Length:564
content-type:application/json
Cookie:JSESSIONID=781C7F500DFA24D663BA243A4D9044BC;path=/yht;HttpOnly
通过这个sessionid就能使浏览器端和服务端保持会话,使浏览器端保持登录状态

但是,微信小程序不能保存Cookie,导致每次wx.request到服务端都会创建一个新的会话,小程序端就不能保持登录状态了

简单的处理方法如下:

1、把服务端response的Set-Cookie中的值保存到Storage中

wx.request({
url: path,
method:method,
header: header,
data:data,
success:function(res){
if(res && res.header && res.header['Set-Cookie']){
wx.setStorageSync('cookieKey', res.header['Set-Cookie']);//保存Cookie到Storage
}
},
fail:fail
})

wx.request再从Storage中取出Cookie,封装到header中

let cookie = wx.getStorageSync('cookieKey');
let path=conf.baseurl+url;
let header = { };
if(cookie){
header.Cookie=cookie;
}
 
wx.request({
url: path,
method:method,
header: header,
data:data,
success:success,
fail:fail
})

解决小程序请求接口时sessionId变化问题_小程序发起的请求springboot收到的session一直变化_Ant-安特的博客-CSDN博客

mikel阅读(282)

解决小程序请求接口时sessionId变化问题

需求:想把登录用户的信息存放在session中,以方便后续的使用(判断是否在登陆状态,获取用户信息…)。

问题描述:但是每次微信小程序请求的时候都会改变sessionid,这就会导致登录成功时存放在session中的信息无法得到。

我们只需要把登陆成功时的sessionid存放起来,在每次请求时再传回去即可。
①、首次请求成功时,在程序端添加
wx.setStorageSync(“cookieKey”, res.header[“Set-Cookie”]);
②、后续再请求时,在header中添加
‘Cookie’: wx.getStorageSync(‘cookieKey’);

小案例如下:

1、首次登录请求成功时,添加一句:

wx.setStorageSync(“cookieKey”, res.header[“Set-Cookie”]);
1
res代表的是请求成功时接收的参数名;其他不做修改。

success: function (res)
1
具体如下:

wx.request({
url: ‘http://localhost:8080/login/user’,
method: “POST”,
data: {
phone: that.data.phone,
password: that.data.password
},
header: {
‘content-type’: ‘application/x-www-form-urlencoded’
},
success: function (res) { //接受后台的回调函数
var resData = res;
console.log(resData);
//不是error代表登录成功
if (resData != “error”) {
wx.setStorageSync(“cookieKey”, res.header[“Set-Cookie”]);

2、此后的每次请求接口时,在header中添加:

‘Cookie’: wx.getStorageSync(‘cookieKey’);
1
具体如下:

header:{
‘content-type’ : ‘application/x-www-form-urlencoded’,
‘Cookie’: wx.getStorageSync(‘cookieKey’)
},

如上即可。

后端获取cookie值,可以通过HttpServletrequest 中的getHeader(“Cookie”);来获取。
————————————————
版权声明:本文为CSDN博主「Ant-安特」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_44952181/article/details/125005655

TP框架session会话处理机制 - 简书

mikel阅读(359)

来源: TP框架session会话处理机制 – 简书

默认情况下,初始化之后系统会自动启动session,如果不希望系统自动启动session的话,可以在TP的CONFIG.PHP文件中设置:

'SESSION_AUTO_START' =>false

框架自动处理session会获取$_COOKIE[‘PHPSESSID’]作为本次会话的ID识别会话并自动初始化session(使用CONFIG.PHP文件中配置参数数组), 之后会话中的key_value存储与读取都是基于这次同一ID的会话, 如果SESSION_AUTO_START为FALSE时需要进行本次会话的手动初始化。

手动初始化会话, 可以在项目的公共文件或者在控制器中通过手动调用助手函数session_start()、session(‘[start]’) 或者框架封装的SESSION操作类, 并传入初始化参数数组, 来启动session。

初始化的参数:
图片.png
初始化:

//TP5的初始化方法
 Session::init(['id' => $session_id, 'prefix'=> 'hyappMS_']);
 Session::start();

//助手函数的初始化方法  TP3.2 5通用
session(['id' => $session_id, 'prefix'=> 'hyappMS_']);
session_start();
后话:

一般来说, 只有TP框架作为小程序的接口提供端才需要进行session的手动初始化, 因为小程序不允许操作cookie, 行内通用的解决方法是将后端登录时返回的SESSION_ID存储在缓存中, 并在请求头中增加一个SESSION_ID的请求头携带缓存中的数据, 后端获取请求头来识别是否小程序内的访问, 如果是使用此SESSION_ID内容来初始化会话。

作者:LittleTrue
链接:https://www.jianshu.com/p/7e138490df8b
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

PHP SESSION PHPSESSID session_id()_alexander_phper的博客-CSDN博客

mikel阅读(240)

来源: PHP SESSION PHPSESSID session_id()_alexander_phper的博客-CSDN博客

PHPSESSID生成
生成规则是根据hash_func散列来生成的,相关的参数有:
– 客户端IP
– 当前时间(秒)
– 当前时间(微妙)
– PHP自带的随机数生产器

hash_func是phpinfo中的session.hash_function配置。如下:

; Select a hash function for use in generating session ids.
; Possible Values
; 0 (MD5 128 bits)
; 1 (SHA-1 160 bits)
; This option may also be set to the name of any hash function supported by
; the hash extension. A list of available hashes is returned by the hash_algos()
; function.
; http://php.net/session.hash-function
session.hash_function=0

PHP session工作原理
以下以cookie传输PHPSESSID描述。
1. 客户端请求一个php的服务端地址。
2. 服务端收到请求,此次php脚本中包含session_start()。
3. 服务端会生成一个PHPSESSID。(默认session存储方式为session.save_handler=files,文件形式存储。生成的session文件名规则即为sess_PHPSESSID,session文件存在session.save_path中。)
4. 服务端响应首部Response Headers:Set-Cookie:PHPSESSID=37vjjasgjdv2ouk1uomhgqkv50; path=/。在客户端生成一个cookie保存此PHPSESSID。
5. 此时,客户端的cookie里面包含了PHPSESSID,之后客户端的每次请求首部Request Headers:Cookie:PHPSESSID=37vjjasgjdv2ouk1uomhgqkv50。服务端之后每次接收到客户端的请求就都能根据这个PHPSESSID来找到服务端的session文件,通过对这个session文件的读写操作即实现了session的超全局变量属性。

如果客户端禁用了cookie,由于无法使用cookie传递PHPSESSID,那么客户端每次请求,服务端都会重新建立一个session文件,而无法通过通过PHPSESSID来重用session文件,所以session也就失效了。
这种情况可以设置session.use_trans_sid来传输PHPSESSID,具体实现方式与cookie的区别就是将PHPSESSID通过HTTP的GET传输。每次请求的地址里面都会补全PHPSESSID参数”url?PHPSESSID=37vjjasgjdv2ouk1uomhgqkv50”来实现。

PHPcli模式通过session_id()使用session
官网说明
可以通过它来获取当前会话的PHPSESSID,也可以通过它来设置当前的会话PHPSESSID。
PHPcli模式下可以通过设置这个,达到使用session的目的,非常方便。
例如:

<?php
// session_id(‘vingbrv8m64asth0nhplu9gmb7’);
session_start();
$_SESSION[md5(rand(100,999))] = rand(100,999);
var_dump($_SESSION);

未使用session_id()的时候,在cli模式下运营此php脚本三次:

可以看到由于cli模式下没有传输PHPSESSID,所以每次都是一次性的session使用。session没有生效。
查看下session文件:

这三个session文件是我们三次cli执行生成的。三个session文件的内容如下:

 

将之前的session文件删除掉,然后如果我们使用session_id(),为cli脚本设定固定的PHPSESSID。

<?php
session_id(‘vingbrv8m64asth0nhplu9gmb7’);
session_start();
$_SESSION[md5(rand(100,999))] = rand(100,999);
var_dump($_SESSION);

然后cli运行脚本三次:

再查看下session文件,就只有一个我们设置的session文件:

文件内容:

这样,在PHPcli模式下,session就可以使用了。
session_id()的作用简略说,即为PHP脚本自己设定了PHPSESSID,而不需要传输PHPSESSID。
另外,cli模式下,session可以使用,apache的ab测试,session也就可以使用了。
————————————————
版权声明:本文为CSDN博主「alexander_phper」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/alexander_phper/article/details/52670608

微信小程序Session问题_finQiQi的博客-CSDN博客_小程序session

mikel阅读(268)

微信小程序——session
今天做微信小程序的时候,遇到一个问题,就是微信虽然提供了类似于ajax的数据通讯工具wx.request,但是因为不是浏览器,因此这个请求是不会带有sessionid的,那么今天就写一篇来记录如果解决微信小程序session的问题。

sessionid有什么用
因为我只写java web多,所以就以java web为主。那么写过java web的都知道,request是一次请求,session是一个会话周期,但是后台是如何识别请求是属于哪个session的呢?这就要降到cookie和session的关系。

我们都知道,session是服务器维护的会话,cookie是客户端(浏览器)持有的保存一些数据的,那么session实际上是通过cookie识别的。(因此当用户浏览器禁用cookie,也就代表服务器端session也被禁用了,无法得知访问是属于哪个session,因此就不存在session了。但是也不代表完全无法得到)那么当浏览器第一次访问网站网站会在response的header中添加一个叫做Set-Cookie的字段,这个字段的含义就是让浏览器将这里面的每条数据都放到你的cookie里面,这对于用户开发者都是不可见的,浏览器会自动放入cookie,而每次请求都会带着set-cookie里面的数据在cookie里,因此服务端只需要看一下cookie里面的sessionid就知道是来源了。在jsp中是jessionid这个值。

针对wx.request添加header
那么知道了原理,我们就可以手动模仿浏览器自动添加cookie这一步,那么app.js里面有一个onShow/onLaunch,在这步里面,我们可以使用一个wx.request去访问我们的后台,那么后台的服务器这时候是可以拿到第一个sessionid的,那么服务端将这个sessionid回复给我们,我们就可以记录下这个header。
首先在我们的app.js全局数据中添加header

globalData: {
userInfo: null,
header: {
‘Cookie’: ”
}
}

这里面可以放我们的cookie,然后请求服务端返回当前会话的sessionid
客户端代码:

wx.request({
url: app.globalData.requestUrl,
data: {
code: res.code
},
success: function (res) {
let ret = res.data;
if (ret.status == 200) {
// 添加到全局数据的header中
app.globalData.header.Cookie = ‘JSESSIONID=’ + ret.data.sessionid;
}
}
})

服务端代码:
ret.put(“sessionid”, request.getSession().getId());
很简单就能直接获得我们的id,这样子,我们就完成了header的获取

那么每次我们的wx.request,就要带上这个header
代码:

wx.request({
url: app.globalData.requestUrl,
// header中添加我们预先放入全局数据中的header,完成session的手动添加,那么就完成了会话的设置
header: app.globalData.header,
method: ‘GET’,
dataType: ‘json’,
success: function(res){
console.log(res.data.data.url)
that.setData({
captcha: res.data.data
})
}
})

图片显示问题
因为有些时候可能需要验证码,而验证码是放到session中的,那么如果直接选择访问服务器返回的验证码地址,可能取出来的就是null了。

比如我们的服务器返回一个url,而这个url实际上是取session中的验证码来生成图片,那么可能就存在问题。

因此,这就是当浏览器禁用了cookie的时候,我们可以通过URL获得sessionid

对于java web来说,url;jessionid=就可以达到和设置header一样的效果,就能解决非request的session问题了

总结
两种办法:
1、针对wx.request,采用全局数据保存sessionid的方式,手动每次请求添加进请求体中
2、针对图片资源,采用url传session方式,将sessionid放入url,可以起到一样的效果
————————————————
版权声明:本文为CSDN博主「finQiQi」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/a610616898/article/details/79413368

微信小程序开发--网络请求封装 - 掘金

mikel阅读(340)

来源: 微信小程序开发–网络请求封装 – 掘金

 1、背景

在做微信小程序开发的时候难免会涉及到网络请求操作,小程序提供的原生网络请求的api如下所示:

wx.request({
  url: 'https://test.com/******', //仅为示例,并非真实的接口地址
  data: {
    x: '',
    y: ''
  },
  header: {
    'content-type': 'application/json' // 默认值
  },
  success (res) {
    console.log(res.data)
  }
})
复制代码

其中 url: 为请求的后台接口地址;

data: 为请求接口需要携带的参数;

header:设置请求的 header,content-type 默认为 application/json,

success: 为请求成功后的回调,res包含请求成功后返回的数据。

更多关于 wx.request的用法可以查看官方介绍。

小程序wx.request官网api介绍

那既然官方已经提供有api,为什么还需要进行二次封装呢?

2、二次封装的原因

第一点、避免重复代码

避免重复代码主要体现在以下几点:

1) 我们公司调用后台接口,除了登录接口外,其它的接口请求都需要在请求头中加入token,如果不做封装的情况下,每次调用网络请求都需要传token,很麻烦。

2)在网络请求的时候往往需要给个加载框,提示用户正在加载…. 如下图所示:

如果不做封装,在每个网络请求的地方如果需要弹出加载框,都需要重复写这一段代码:

请求开始的时候,显示加载框。

请求结束的时候,隐藏加载框:

第二点、避免回调地狱

一个页面如果有多个网络请求,并且请求有一定的顺序,wx.request 是异步操作,那么最直接的结果就如下所示代码:

onLoad: function () {
    wx.request({
      url: 'https://test.com/api/test01',
      success:res=>{
        wx.request({
          url: 'https://test.com/api/test02',
          success: res=>{
            wx.request({
              url: 'https://test.com/api/test03',
              success: res=>{
                testDataList: res.content
              }
            })
          }
        })
      }
    })
  },
复制代码

是不是很像俄罗斯套娃。

为了避免这种写法,当然进行封装了,在这个地方用到了Promise。

关于Promise的介绍可以到廖雪峰的官方网站去查看,有详细的介绍。

Promise – 廖雪峰的官方网站研究互联网产品和技术,提供原创中文精品教程 https://www.liaoxuefeng.com/wiki/1022910821149312/1023024413276544

3、具体的封装实现

工程结构:

139F7EF1-50C8-4e90-BD17-4DA307C9302E.png

在utils文件夹下新建了两个文件。

1) httpUtils.js

网络请求的封装,具体代码如下:

const ui = require('./ui');
const BASE_URL = 'https://www.wanandroid.com'


/**
 * 网络请求request
 * obj.data 请求接口需要传递的数据
 * obj.showLoading 控制是否显示加载Loading 默认为false不显示
 * obj.contentType 默认为 application/json
 * obj.method 请求的方法  默认为GET
 * obj.url 请求的接口路径 
 * obj.message 加载数据提示语
 */
function request(obj) {
    return new Promise(function(resolve, reject) {
      if(obj.showLoading){
        ui.showLoading(obj.message? obj.message : '加载中...');
      }
      var data = {};
      if(obj.data) {
        data = obj.data;
      }
      var contentType = 'application/json';
      if(obj.contentType){
        contentType = obj.contentType;
      } 
  
      var method = 'GET';
      if(obj.method){
        method = obj.method;
      }
  
      wx.request({
        url: BASE_URL + obj.url,
        data: data,
        method: method,
        //添加请求头
        header: {
          'Content-Type': contentType ,
          'token': wx.getStorageSync('token') //获取保存的token
        },
        //请求成功
        success: function(res) {
          console.log('===============================================================================================')
          console.log('==    接口地址:' + obj.url);
          console.log('==    接口参数:' + JSON.stringify(data));
          console.log('==    请求类型:' + method);
          console.log("==    接口状态:" + res.statusCode);
          console.log("==    接口数据:" + JSON.stringify(res.data));
          console.log('===============================================================================================')
          if (res.statusCode == 200) {
            resolve(res);
          } else if (res.statusCode == 401) {//授权失效
            reject("登录已过期");
            jumpToLogin();//跳转到登录页
          } else {
            //请求失败
            reject("请求失败:" + res.statusCode)
          }
        },
        fail: function(err) {
          //服务器连接异常
          console.log('===============================================================================================')
          console.log('==    接口地址:' + url)
          console.log('==    接口参数:' + JSON.stringify(data))
          console.log('==    请求类型:' + method)
          console.log("==    服务器连接异常")
          console.log('===============================================================================================')
          reject("服务器连接异常,请检查网络再试");
        },
        complete: function() {
          ui.hideLoading();
        }
      })
    });
  }
  

  //跳转到登录页
  function jumpToLogin(){
    wx.reLaunch({
      url: '/pages/login/login',
    })
  }
  
  module.exports = {
    request,
  }
  
复制代码

代码中有详细的注释,在这里就不多做解释了。

2) ui.js

主要是对wx UI操作的一些简单封装,代码如下:

export const showToast = function(content,duration) {
    if(!duration) duration = 2000
    wx.showToast({
        title: content,
        icon: 'none',
        duration: duration,
    })
  }
  
  var isShowLoading = false
  export const showLoading = function(title) {
    if(isShowLoading) return
    wx.showLoading({
        title: title?title:'',
        mask:true,
        success:()=>{
            isShowLoading = true
        }
    })
  }
  
  export const hideLoading = function() {
    if(!isShowLoading) return
    isShowLoading = false
    wx.hideLoading()
  }
复制代码

3) 具体调用

在index.js 进行了网络请求,具体代码如下:

// index.js
const httpUtils = require('../../utils/httpUtils')
const ui = require('../../utils/ui')

Page({
  data: {
    str:null,
  },

  onLoad() {
  },

  //获取接口数据
  getNetInfo(){
    let obj = {
      method: "POST",
      showLoading: true,
      url:`/user/register?username=pppooo11&password=pppooo&repassword=pppooo`,
      message:"正在注册..."
    }
    httpUtils.request(obj).then(res=>{
      this.setData({
        str:JSON.stringify(res)
      })
      ui.showToast(res.data.errorMsg)
    }).catch(err=>{
      console.log('ERROR')
    });
  }
})
复制代码

好了,到这里也就结束了,如果上面的内容对你有所帮助不要忘记点个赞哟。

代码已经上传到了github上面,感兴趣的可以点击下载。

网络封装源码

作者:YMAndroid
链接:https://juejin.cn/post/7025471607367811080
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。