1. Uniapp的网络请求
在Uniapp中,我们可以使用uni.request进行网络请求。uni.request能够在小程序端、H5端、以及APP端运行,在实际的开发中也比较常用。该API的基本格式如下:
uni.request({
url: '',
method: '',
data: {},
header: {},
dataType: '',
responseType: '',
success: function(res) {
},
fail: function(err) {
},
complete: function() {
}
});
其中,url为请求的地址;method为请求方法(GET、POST等);data为请求参数;header为请求头信息;dataType为返回数据的类型(json、text等);responseType为响应数据的类型(arraybuffer、text等)。
2. V3 接口
相信大家对API还是很熟悉的。API分为不同的版本。而V3相比V2来说,变化就很大,例如它的签名方式(HMAC-SHA256);响应体的格式(XML);请求体的格式(JSON)。如果我们想要在Uniapp中请求V3接口,除了需要确保请求头信息中携带本次请求的签名以及sign-type外,还需要考虑响应体和请求体的格式问题。
3. 封装支持V3的网络请求
3.1. 安装依赖库
我们可以使用npm来安装一些在该项目中需要使用的依赖库。在命令行终端中输入如下指令,即可将依赖库下载到我们的项目中。
npm install --save crypto-js
其中,crypto-js是一个JavaScript加密类库,它包含了常见的加密算法,例如AES、DES、3DES、SHA256等。
3.2. 配置请求头信息
在进行V3接口请求时,我们需要在请求头信息中添加签名以及签名类型。因此,我们可以封装一个getHeader方法,在其中对请求头进行设置。
// 工具类utils中的getHeader方法
import CryptoJS from 'crypto-js'
getHeader: function(data) {
const timestamp = Date.now()
let contentSha256 = ''
if (data) {
contentSha256 = CryptoJS.SHA256(JSON.stringify(data)).toString(CryptoJS.enc.Hex);
}
const signStr = `POST\n/application/json\n\nx-ca-timestamp:${timestamp}\nx-ca-version:1.0\n/TAG/QUERY`
const sign = CryptoJS.enc.Base64.stringify(CryptoJS.HmacSHA256(signStr, 'APPSECRET'))
const headerData = {
'X-Ca-Version': '1.0',
'X-Ca-Timestamp': timestamp.toString(),
'X-Ca-Signature': sign,
'X-Ca-Signature-Headers': 'X-Ca-Timestamp,X-Ca-Version',
'Content-Type': 'application/json;charset=UTF-8',
}
if (data) {
headerData['Content-MD5'] = contentSha256
}
return headerData
}
其中,timestamp为当前的时间戳;signStr为签名字符串;sign为生成的签名;headerData则是要加入请求头的所有信息,这里我们使用对象的方式进行设置。
3.3. 网络请求封装实现
在对请求头信息进行配置之后,我们就可以对Uni.request进行二次封装。我们可以将其封装为一个Promise的方式,这样我们在进行异步请求时,就可以使用await进行等待响应结果。
// 封装一个network方法,用于发起请求
import uniRequest from 'uni-request'
import utils from '@/common/utils'
const TAG = '/TAG/QUERY'
export default async function network(data) {
const headerData = utils.getHeader(data)
const requestData = {
url: 'https://gateway.xxx.com' + TAG,
method: 'POST',
data: data,
header: headerData,
}
const response = await uniRequest(requestData)
if (response.status === 200) {
return response.data
} else {
throw new Error('网络请求错误')
}
}
其中,utils.getHeader(data)会根据传入的参数data获取请求头信息;requestData则是包含了Uni.request的所有信息,即url、method、data、header等。我们在发起请求后,在响应成功时,返回响应体中的data。如果发生了错误,则使用throw new Error的方式抛出错误。
3.4. 调用网络请求封装方法
在我们对网络请求进行封装之后,在具体进行业务开发时,我们只需要调用network方法即可。下面是一个示例代码:
async requestDemo() {
const requestData = {
'Param1': 'value1',
'Param2': 'value2',
// ...
}
try {
const response = await network(requestData)
console.log(response)
} catch (err) {
console.log(err)
}
}
其中,requestData就是封装好的请求体参数信息。请求发送成功后,我们可以通过response.responseData来获取响应结果。如果发生了错误,则会进入catch分支,打印错误信息。
4. 总结
在Uniapp中,我们可以使用Uni.request进行网络请求。但是在进行V3接口的请求时,我们需要对请求头信息进行配置,以满足V3接口对签名和响应体的格式的要求。通过封装网络请求的方法,我们可以在具体的业务开发中,大大提高代码的复用性和可读性。