request

uni.request()做了一层单独的封装,拦截请求头参数,设置响应参数等。

  1. import store from '@/store/index';
  2. import { TOKEN_KEY } from '@/config/storage-key';
  3. import APIConfig from '@/config';
  4. let baseUrl = '';
  5. if (process.env.NODE_ENV === 'development') {
  6. console.log('开发环境');
  7. baseUrl = 'https://gmall-prod.atguigu.cn/skb';
  8. } else {
  9. console.log('生产环境');
  10. baseUrl = 'https://gmall-prod.atguigu.cn/skb';
  11. }
  12. class Service {
  13. api(opts = {}) {
  14. // 监听网络状态
  15. uni.onNetworkStatusChange((res) => {
  16. if (!res.isConnected) {
  17. console.log('网路无链接');
  18. uni.showToast({
  19. title: '网络连接不可用!',
  20. icon: 'none',
  21. });
  22. }
  23. return false;
  24. });
  25. // 定义参数对象
  26. if (!opts.method) opts.method = 'get';
  27. if (opts.domain) baseUrl = opts.domain;
  28. // 鉴权
  29. let token = store.state.token;
  30. let authorize = '';
  31. if (uni.getStorageSync(TOKEN_KEY)) token = uni.getStorageSync(TOKEN_KEY);
  32. if (uni.getStorageSync('Authorization'))
  33. authorize = uni.getStorageSync('Authorization');
  34. const header = {
  35. token,
  36. 'Content-type': 'application/json; charset=UTF-8',
  37. appid: APIConfig.appid,
  38. };
  39. // 删除鉴权
  40. if (opts.noAuth) {
  41. delete header.Authorization;
  42. }
  43. uni.showLoading();
  44. console.log(opts);
  45. return new Promise((resolve, reject) => {
  46. uni.request({
  47. url: baseUrl + opts.url,
  48. data: opts.data,
  49. method: opts.method,
  50. header,
  51. success: (res) => {
  52. console.log('res', res);
  53. uni.hideLoading();
  54. if (res.statusCode === 200) {
  55. if (res.data.code == 200) {
  56. resolve(res.data);
  57. } else if (res.data.code == 28004) {
  58. uni.showModal({
  59. title: '提示',
  60. content: '登录过期,请重新登录',
  61. success: function (res) {
  62. if (res.confirm) {
  63. uni.redirectTo({
  64. url: '/pages/login/index',
  65. });
  66. uni.clearStorageSync();
  67. } else if (res.cancel) {
  68. console.log('用户不想登陆');
  69. }
  70. },
  71. });
  72. resolve(res.data);
  73. } else {
  74. uni.showToast({
  75. title: res.data.message,
  76. icon: 'error',
  77. duration: 1500,
  78. });
  79. reject(res.data);
  80. }
  81. }
  82. },
  83. fail: () => {
  84. uni.hideLoading();
  85. uni.showToast({
  86. title: 'net error!',
  87. icon: 'none',
  88. duration: 2000,
  89. });
  90. },
  91. });
  92. });
  93. }
  94. get(options = {}) {
  95. options.method = 'GET';
  96. return this.api(options);
  97. }
  98. post(options = {}) {
  99. options.method = 'POST';
  100. return this.api(options);
  101. }
  102. pus(options = {}) {
  103. options.method = 'PUT';
  104. return this.api(options);
  105. }
  106. delete(options = {}) {
  107. options.method = 'DELETE';
  108. return this.api(options);
  109. }
  110. }
  111. export default Service;

这里http主要做了几件事

  • 根据NODE_ENV设置不同的baseUrl
  • 根据不同method处理不同的请求
  • 设置token,token从store当中获取,存入了localstorage
  • 请求加载loading
  • 请求失败提示toast
  • token过期提示重新登陆

    store

    ```javascript

import Vue from ‘vue’; import Vuex from ‘vuex’; import { TOKEN_KEY, USER_KEY } from ‘@/config/storage-key’; Vue.use(Vuex); // 可测试token:eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJndWxpLXVzZXIiLCJpYXQiOjE2NjE0OTQ5OTQsImV4cCI6MTY2Mjk2NjIyMywiaWQiOiIxIiwibmlja25hbWUiOiLlvKDlsI8ifQ.IVkvP_NJmoDGaTmEbRYZKt80ybOA7g795ku1ZmdwQsI const store = new Vuex.Store({ state: { token: uni.getStorageSync(TOKEN_KEY) || ‘’, user: JSON.parse(uni.getStorageSync(USER_KEY) || ‘{}’), }, getters: {}, mutations: { setUser(state, user) { state.user = user; uni.setStorageSync(USER_KEY, JSON.stringify(user)); }, setToken(state, token) { state.token = token; uni.setStorageSync(TOKEN_KEY, token); } }, actions: { /**

  1. * @description: 设置用户信息参数
  2. * @param {*} commit
  3. * @param {*} payload
  4. * @return {*}
  5. */
  6. setUser({ commit }, payload) {
  7. commit('setUser', payload);
  8. },
  9. /**
  10. * @description: 设置token
  11. * @param {*} commit
  12. * @param {*} payload
  13. * @return {*}
  14. */
  15. setToken({ commit }, payload) {
  16. commit('setToken', payload);
  17. },

}, modules: {}, }); export default store;

  1. `main.js`中需要注册一下store
  2. ```javascript
  3. import Vue from 'vue'
  4. import App from './App'
  5. Vue.config.productionTip = false
  6. App.mpType = 'app'
  7. import store from '@/store/index';
  8. const app = new Vue({
  9. ...App,
  10. store
  11. })
  12. app.$mount()

storage-key

  1. // 本地存储token的key
  2. export const TOKEN_KEY = 'token';
  3. // 本地存储用户信息的key
  4. export const USER_KEY = 'user';

测试request

先写个测试用的login接口

  1. import Service from '@/utils/http';
  2. class User extends Service {
  3. /**
  4. * @description: 小程序登陆接口
  5. * @param {*} options
  6. * @return {*}
  7. */
  8. login(options = {}) {
  9. console.log(123);
  10. options.url = `/api/ucenter/webChat/callback?code=${options.code}`;
  11. return this.get(options);
  12. }
  13. }
  14. const userService = new User();
  15. export default userService;

在user页面去测试登陆接口是否能发送请求

  1. <template>
  2. <view class="content"> 我的 </view>
  3. </template>
  4. <script>
  5. import userService from "@/services/user";
  6. export default {
  7. name: "user",
  8. onLoad() {
  9. this.login();
  10. },
  11. methods: {
  12. // 请求登陆接口
  13. async login() {
  14. console.log(1);
  15. try {
  16. const res = await userService.login({
  17. code: "123",
  18. });
  19. console.log(res);
  20. } catch (e) {
  21. console.log(e);
  22. }
  23. },
  24. },
  25. };
  26. </script>
  27. <style scoped lang="scss">
  28. .content {
  29. background: red;
  30. }
  31. </style>

image.png
request请求正常