Taro request 請求封裝


在根目錄下創建service文件夾

再創建 baseUrl文件 寫入請求地址

const getBaseUrl = (url) => {
  let BASE_URL = '';
  if (process.env.NODE_ENV === 'development') {
    //開發環境 - 根據請求不同返回不同的BASE_URL
BASE_URL = 'https://*********'
  } else {
    // 生產環境

BASE_URL = 'https://*********'
   
  }
  return BASE_URL
}

export default getBaseUrl;

 創建config.js文件寫入常用狀態碼

export const HTTP_STATUS = {
  SUCCESS: 200,
  CREATED: 201,
  ACCEPTED: 202,
  CLIENT_ERROR: 400,
  AUTHENTICATE: 401,
  FORBIDDEN: 403,
  NOT_FOUND: 404,
  SERVER_ERROR: 500,
  BAD_GATEWAY: 502,
  SERVICE_UNAVAILABLE: 503,
  GATEWAY_TIMEOUT: 504
}

  創建http文件寫入邏輯

import Taro from '@tarojs/taro'
import getBaseUrl from './baseUrl'
import interceptors from './interceptors'
 
interceptors.forEach(interceptorItem => Taro.addInterceptor(interceptorItem))
 
class httpRequest {
   
  baseOptions(params, method = "GET") {
    let { url, data,param } = params;
    const BASE_URL = getBaseUrl(url);
    // let contentType = "application/x-www-form-urlencoded";
    let contentType = "application/json;charset=UTF-8";
    contentType = params.contentType || contentType;
    const option = {
      url: BASE_URL + url,  //地址
      data: data,   //傳參
      method: method, //請求方式
      timeout:50000, // 超時時間
      header: {  //請求頭
        'content-type': contentType,      
        'Authorization':Taro.getStorageSync('Authorization')
      }
    };
    return Taro.request(option);
  }
 
  get(url, data = "",param) {
    let option = { url, data,param };
    return this.baseOptions(option);
  }
 
  post(url, data,param, contentType) {
    let params = { url, data,param, contentType };
    return this.baseOptions(params, "POST");
  }
 
  put(url, data = "") {
    let option = { url, data };
    return this.baseOptions(option, "PUT");
  }
 
  delete(url, data = "") {
    let option = { url, data };
    return this.baseOptions(option, "DELETE");
  }
 
}
 
export default new httpRequest()

  

  再創建interceptors文件 寫入異常顯示邏輯

import Taro from "@tarojs/taro"
import { pageToLogin } from "./utils"
import { HTTP_STATUS } from './config'

const customInterceptor = (chain) => {

  const requestParams = chain.requestParams
  Taro.showLoading({
    title: '加載中',
  })
  return chain.proceed(requestParams).then(res => {
    Taro.hideLoading()
    // 只要請求成功,不管返回什么狀態碼,都走這個回調
    if (res.statusCode === HTTP_STATUS.NOT_FOUND) {
      return Promise.reject({ desc: '請求資源不存在' })

    } else if (res.statusCode === HTTP_STATUS.BAD_GATEWAY) {
      return Promise.reject({ desc: "服務端出現了問題" })

    } else if (res.statusCode === HTTP_STATUS.FORBIDDEN) {
      Taro.setStorageSync("Authorization", "")
      pageToLogin()
      // TODO 根據自身業務修改
      return Promise.reject({ desc: "沒有權限訪問" });

    } else if (res.statusCode === HTTP_STATUS.AUTHENTICATE) {
      Taro.setStorageSync("Authorization", "")
      pageToLogin()
      return Promise.reject({ desc: "需要鑒權" })

    } else if (res.statusCode === HTTP_STATUS.SERVER_ERROR) {
      return Promise.reject({ desc: "服務器錯誤" });
    } else if (res.statusCode === HTTP_STATUS.SUCCESS) {
      if (res.data.code === 0) {
        return res.data
      } else if (res.data.code == '-100') {
        //非法登錄
        pageToLogin()
      }
      else {
        return Promise.reject(res.data)
      }
    }
  }).catch(error=> {
    Taro.hideLoading()
    console.error(error)
    return Promise.reject(error)
  })
}

// Taro 提供了兩個內置攔截器
// logInterceptor - 用於打印請求的相關信息
// timeoutInterceptor - 在請求超時時拋出錯誤。
// const interceptors = [customInterceptor, Taro.interceptors.logInterceptor]
const interceptors = [customInterceptor]

export default interceptors

  創建utils文件 寫入處理異常狀態方法

import Taro from "@tarojs/taro";
/**
 * @description 獲取當前頁url
 */
export const getCurrentPageUrl = () => {
  let pages = Taro.getCurrentPages()
  let currentPage = pages[pages.length - 1]
  let url = currentPage.route
  return url
}

export const pageToLogin = () => {
  let path = getCurrentPageUrl()
  Taro.clearStorage()
  if (!path.includes('login')) {
    Taro.reLaunch({
      url: "/pages/login/login"
    });
  }
}

  最后創建 servers文件進行api注冊

import HTTPREQUEST from "./http"

export const getLogin = (data) => {
  return HTTPREQUEST.post('/api/login/login', data)
}

  最后在頁面引入就可以了


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM