Uniapp如何封装一个支持v3的网络请求

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接口对签名和响应体的格式的要求。通过封装网络请求的方法,我们可以在具体的业务开发中,大大提高代码的复用性和可读性。