发起请求

使用 uni.request(OBJECT) 发起一个请求。

例如:

  1. uni.request({
  2. url: '//www.baidu.com', //仅为示例,并非真实接口地址。
  3. data: {
  4. text: 'uni.request'
  5. },
  6. header: {
  7. 'custom-header': 'hello' //自定义请求头信息
  8. },
  9. success (res) {
  10. console.log(res);
  11. }
  12. });

001.png
002.png

OBJECT 参数说明

参数名 类型 必填 默认值 说明
url String 开发者服务器接口地址
data Object/String/ArrayBuffer 请求的参数
header Object 设置请求的 header,header 中不能设置 Referer。
method String GET (需大写)有效值:OPTIONS, GET, HEAD, POST, PUT, DELETE, TRACE, CONNECT
dataType String json 如果设为 json,会尝试对返回的数据做一次 JSON.parse
responseType String text 设置响应的数据类型。合法值:text、arraybuffer
success Function 收到开发者服务成功返回的回调函数
fail Function 接口调用失败的回调函数
complete Function 接口调用结束的回调函数(调用成功、失败都会执行)

success 返回参数说明

参数 类型 说明
data Object/String/ArrayBuffer 开发者服务器返回的数据
statusCode Number 开发者服务器返回的 HTTP 状态码
header Object 开发者服务器返回的 HTTP Response Header

data 数据说明

最终发送给服务器的数据是 String 类型,如果传入的 data 不是 String 类型,会被转换成 String。转换规则如下:

  • 对于 GET 方法,会将数据转换为 query string。例如 { name: 'name', age: 18 } 转换后的结果是 name=name&age=18
  • 对于 POST 方法且 header['content-type']application/json 的数据,会进行 JSON 序列化。
  • 对于 POST 方法且 header['content-type']application/x-www-form-urlencoded 的数据,会将数据转换为 query string。

请求类的封装

平时使用习惯了 axios,于是按照 axios 的形式将 uni.request 封装了一层:

library/requset.js

  1. class Axios {
  2. constructor (baseUrl) {
  3. this.baseUrl = baseUrl
  4. }
  5. base (obj, method) {
  6. return new Promise((resolve, reject) => {
  7. const tokenObj = {token: uni.getStorageSync('token')}
  8. uni.request({
  9. url: `${this.baseUrl}${obj.url}`,
  10. method,
  11. dataType: obj.dataType ? obj.dataType : 'json',
  12. responseType: obj.responseType ? obj.responseType : 'text',
  13. data: obj.data ? obj.data : {},
  14. header: Object.assign(obj.header ? obj.header : {}, tokenObj),
  15. success (res) {
  16. resolve(res)
  17. },
  18. fail () {
  19. reject()
  20. }
  21. })
  22. })
  23. }
  24. get (obj) { return this.base(obj, 'GET') }
  25. post (obj) { return this.base(obj, 'POST') }
  26. put (obj) { return this.base(obj, 'PUT') }
  27. delete (obj) { return this.base(obj, 'DELETE') }
  28. }
  29. const baseUrl = 'https://www.baidu.com/'
  30. export default new Axios(baseUrl)

main.js

  1. import axios from './library/request'
  2. Vue.prototype.axios = axios

在组件中的使用:

  1. this.axios.get({
  2. url: 'index.html',
  3. data: { test: 'test' },
  4. header: { my_header: 'my_header'}
  5. })
  6. .then(res => console.log(res))
  7. .catch(e => console.log(e))

拦截器模拟

上述封装, 只是一个简单的请求类封装, 并没有额外的功能, 比如响应拦截器, 可以使用以下方式简单地模拟一个拦截器:

  1. class Axios {
  2. // ...
  3. base (obj, method) {
  4. return new Promise((resolve, reject) => {
  5. const tokenObj = {
  6. 'Authorization': `bearer ${uni.getStorageSync('access_token')}`,
  7. 'Content-Type': 'application/x-www-form-urlencoded'
  8. }
  9. uni.request({
  10. url: `${this.baseUrl}${obj.url}`,
  11. method,
  12. dataType: obj.dataType ? obj.dataType : 'json',
  13. responseType: obj.responseType ? obj.responseType : 'text',
  14. data: obj.data ? obj.data : {},
  15. header: Object.assign(obj.header ? obj.header : {}, tokenObj),
  16. success (res) {
  17. // 权限不足认证失败
  18. if (res.statusCode === 401 || res.data.status === -1) {
  19. interceptor()
  20. } else if (res.statusCode === 500 || res.statusCode === 400 || res.statusCode === 404) {
  21. reject('接口调用失败')
  22. } else if (res.data.status === 0) {
  23. reject('数据请求失败')
  24. } else {
  25. resolve(res)
  26. }
  27. },
  28. fail () {
  29. reject('未知错误')
  30. }
  31. })
  32. })
  33. }
  34. // ...
  35. }
  36. // ...

参考资料