关于小程序中网络相关API的说明
在小程序中使用网络相关的 API 时,需要注意下列问题:
服务器域名配置
每个微信小程序需要事先设置一个通讯域名,小程序可以跟指定的域名与进行网络通信。包括普通 HTTPS请求(request)、上传文件(uploadFile)、下载文件(downloadFile) 和 WebSocket 通信(connectSocket)
配置流程
服务器域名请在 小程序后台-设置-开发设置-服务器域名 中进行配置,配置时需要注意:
域名只支持 https (request、uploadFile、downloadFile) 和 wss (connectSocket) 协议;
域名不能使用 IP 地址或 localhost,且不能带端口号;
域名必须经过 ICP 备案;
出于安全考虑,api.weixin.qq.com 不能被配置为服务器域名,相关API也不能在小程序内调用。开发者应将 appsecret 保存到后台服务器中,通过服务器使用 appsecret 获取 accesstoken,并调用相关 API。
对于每个接口,分别可以配置最多20个域名
HTTPS 证书
小程序必须使用 HTTPS 请求。小程序内会对服务器域名使用的HTTPS 证书进行校验,如果校验失败,则请求不能成功发起。由于系统限制,不同平台对于证书要求的严格程度不同。为了保证小程序的兼容性,建议开发者按照最高标准进行证书配置,并使用相关工具检查现有证书是否符合要求。
对证书要求如下:HTTPS 证书必须有效。证书必须被系统信任,部署SSL证书的网站域名必须与证书颁发的域名一致,证书必须在有效期内;
iOS 不支持自签名证书;
iOS 下证书必须满足苹果 App Transport Security (ATS) 的要求;
TLS 必须支持 1.2 及以上版本。部分旧 Android 机型还未支持 TLS 1.2,请确保 HTTPS 服务器的 TLS 版本支持1.2及以下版本;
部分 CA 可能不被操作系统信任,请开发者在选择证书时注意小程序和各系统的相关通告。
关于请求
默认超时时间和最大超时时间都是 60s
request、uploadFile、downloadFile的最大并发限制是 10个
网络请求的 referer header不可设置。其格式固定为 https://servicewechat.com/{appid}/{version}/page-frame.html,其中{appid}为小程序的 appid,{version} 为小程序的版本号,版本号为 0 表示为开发版、体验版以及审核版本,版本号为 devtools 表示为开发者工具,其余为正式版本。
小程序进入后台运行后(非置顶聊天),如果 5s 内网络请求没有结束,会回调错误信息 fail interrupted;在回到前台之前,网络请求接口调用都会无法调用。
关于服务器返回
返回值编码
建议服务器返回值使用 UTF-8 编码。对于非 UTF-8 编码,小程序会尝试进行转换,但是会有转换失败的可能。
小程序会自动对BOM 头进行过滤。
回调
只要成功接收到服务器返回,无论statusCode是多少,都会进入success回调。请开发者根据业务逻辑对返回值进行判断。
wx.request(OBJECT)网络请求示例代码:// wx.request 网络请求(./util.js)
function http(url,callBack,data) {
wx.request({
url: url, // 请求服务器地址
data:{skip:data}, // 请求的参数
method: 'GET', // (需大写)有效值:OPTIONS, GET, HEAD, POST, PUT, DELETE, TRACE, CONNECT
header: { // 设置请求的 header,header 中不能设置 Referer。
// 'content-type': 'application/json' // 默认值
'content-type': 'application/xml' // 默认值
},
success: function (res) { // 收到开发者服务成功返回的回调函数
// success
callBack(res.data);
},
fail: function () { // 接口调用失败的回调函数
console.log("出错了!");
}
});
}/**
* 生命周期函数--监听页面加载
*/
onLoad: function (e) {
var that = this;
wx.showLoading({ title: '加载中', }); // 数据加载提示框
// 文章列表请求
var url = app.globalData.wxBlogUrl + "ArticleList";
util.http(url, that.blogArticleData);
},// 文章数据处理
blogArticleData: function (data) {
var totalArticle = {};
if (data != '') {// 判断请求数据返回是否为空
// 追加文章新数据和旧数据合并
if (!this.data.isEmpty && this.data.totalCount != 0) {
totalArticle = this.data.Article.concat(data);
} else {
totalArticle = data;
this.data.isEmpty = false;
}
console.log(totalArticle);
this.setData({
Article: totalArticle
});
wx.hideLoading(); // 隐藏提示框
}else{
wx.showToast({
title: '没有更多的数据!',
icon: 'success',
duration: 2000
})
}
},