亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

React項(xiàng)目中axios的封裝與API接口的管理詳解

 更新時(shí)間:2021年09月29日 09:01:03   作者:北孤清茶  
Axios是一個(gè)npm軟件包,允許應(yīng)用程序?qū)TTP請(qǐng)求發(fā)送到Web API,下面這篇文章主要給大家介紹了關(guān)于React項(xiàng)目中axios的封裝與API接口的管理的相關(guān)資料,需要的朋友可以參考下

前言

在react項(xiàng)目中,和后臺(tái)交互獲取數(shù)據(jù)這塊,我們通常使用的是axios庫(kù),它是基于promise的http庫(kù),可運(yùn)行在瀏覽器端和node.js中。他有很多優(yōu)秀的特性,例如攔截請(qǐng)求和響應(yīng)、取消請(qǐng)求、轉(zhuǎn)換json、客戶端防御XSRF等。如果還對(duì)axios不了解的,可以移步axios文檔。

安裝

//使用npm安裝
npm install axios; 
//使用yarn安裝
yarn add axios

引入

在項(xiàng)目根目錄中,新建一個(gè)request文件夾,然后在里面新建一個(gè)index.js和一個(gè)api.js文件。index.js文件用來(lái)封裝我們的axios,api.js用來(lái)統(tǒng)一管理我們的接口。

//在index.js中引入axios
import axios from 'axios';
//引入qs模塊,用來(lái)序列化post類型的數(shù)據(jù)
import QS from 'qs';
//antd的message提示組件,大家可根據(jù)自己的ui組件更改。
import { message } from 'antd'

環(huán)境的切換

我們的項(xiàng)目環(huán)境可能有開(kāi)發(fā)環(huán)境、測(cè)試環(huán)境和生產(chǎn)環(huán)境。我們通過(guò)node的環(huán)境變量來(lái)匹配我們的默認(rèn)的接口url前綴。這里需要node的全局變量process,process.env.NODE_ENV可以區(qū)分是開(kāi)發(fā)環(huán)境還是生產(chǎn)環(huán)境。

//保存環(huán)境變量
const isPrd = process.env.NODE_ENV == 'production';

//區(qū)分開(kāi)發(fā)環(huán)境還是生產(chǎn)環(huán)境基礎(chǔ)URL
export const basciUrl = isPrd ? 'https://www.production.com' : 'http://www.development.com'

這里導(dǎo)出基礎(chǔ)URL是為了防止有其他地方用到資源不一樣,需要區(qū)分生產(chǎn)環(huán)境還是開(kāi)發(fā)環(huán)境,導(dǎo)入就直接可以用了。

請(qǐng)求攔截

我們?cè)诎l(fā)送請(qǐng)求前可以進(jìn)行一個(gè)請(qǐng)求的攔截,為什么要攔截呢,我們攔截請(qǐng)求是用來(lái)做什么的呢?比如,有些請(qǐng)求是需要用戶登錄之后才能訪問(wèn)的,或者post請(qǐng)求的時(shí)候,我們需要序列化我們提交的數(shù)據(jù)。這時(shí)候,我們可以在請(qǐng)求被發(fā)送之前進(jìn)行一個(gè)攔截,從而進(jìn)行我們想要的操作。

//設(shè)置axios基礎(chǔ)路徑
const service = axios.create({
  baseURL: basicUrl
})
// 請(qǐng)求攔截器
service.interceptors.request.use(config => { 
  // 每次發(fā)送請(qǐng)求之前本地存儲(chǔ)中是否存在token,也可以通過(guò)Redux這里只演示通過(guò)本地拿到token
  // 如果存在,則統(tǒng)一在http請(qǐng)求的header都加上token,這樣后臺(tái)根據(jù)token判斷你的登錄情況
  // 即使本地存在token,也有可能token是過(guò)期的,所以在響應(yīng)攔截器中要對(duì)返回狀態(tài)進(jìn)行判斷 
  const token = window.localStorage.getItem('userToken') || window.sessionStorage.getItem('userToken');
  //在每次的請(qǐng)求中添加token
  config.data = Object.assign({}, config.data, {
    token: token,
  })
  //設(shè)置請(qǐng)求頭
  config.headers = {
    'Content-Type': 'application/x-www-form-urlencoded; charset=utf-8'
  }
  config.data = QS.stringify(config.data)
  return config
}, error => { 
    return error;
})

這里說(shuō)一下token,一般是在登錄完成之后,將用戶的token通過(guò)localStorage或者sessionStorage存在本地,然后用戶每次在進(jìn)入頁(yè)面的時(shí)候(即在main.js中),會(huì)首先從本地存儲(chǔ)中讀取token,如果token存在說(shuō)明用戶已經(jīng)登陸過(guò),則更新Redux中的token狀態(tài)。然后,在每次請(qǐng)求接口的時(shí)候,都會(huì)在請(qǐng)求的header中攜帶token,后臺(tái)人員就可以根據(jù)你攜帶的token來(lái)判斷你的登錄是否過(guò)期,如果沒(méi)有攜帶,則說(shuō)明沒(méi)有登錄過(guò)。

響應(yīng)攔截

// 響應(yīng)攔截器
service.interceptors.response.use(response => {
  //根據(jù)返回不同的狀態(tài)碼做不同的事情
  // 這里一定要和后臺(tái)開(kāi)發(fā)人員協(xié)商好統(tǒng)一的錯(cuò)誤狀態(tài)碼
  if (response.code) {
    switch (response.code) {
      case 200:
        return response.data;
      case 401:
        //未登錄處理方法
        break;
      case 403:
        //token過(guò)期處理方法
        break;
      default:
        message.error(response.data.msg)
    }
  } else { 
    return response;
  }
})
//最后把封裝好的axios導(dǎo)出
export default service

響應(yīng)攔截器很好理解,就是服務(wù)器返回給我們的數(shù)據(jù),我們?cè)谀玫街翱梢詫?duì)他進(jìn)行一些處理。例如上面的思想:如果后臺(tái)返回的狀態(tài)碼是200,則正常返回?cái)?shù)據(jù),否則的根據(jù)錯(cuò)誤的狀態(tài)碼類型進(jìn)行一些我們需要的錯(cuò)誤,具體返回的狀態(tài)碼需要處理那些流程還需要跟后臺(tái)開(kāi)發(fā)人員協(xié)商。

上面的message.error()方法時(shí)我引入的antd的庫(kù)提示組件,需要根據(jù)你的UI庫(kù),對(duì)應(yīng)使用提示組件

api的統(tǒng)一管理

整齊的api就像電路板一樣,即使再?gòu)?fù)雜也能很清晰整個(gè)線路。上面說(shuō)了,我們會(huì)新建一個(gè)api.js,然后在這個(gè)文件中存放我們所有的api接口。

首先我們?cè)赼pi.js中引入我們封裝的axios

//導(dǎo)入我們封裝好的axios 
import service from './index'

現(xiàn)在,例如我們有這樣一個(gè)接口,是一個(gè)post請(qǐng)求:

http://www.development.com/api/v1/articleEdit

我們可以在api.js中這樣封裝:

export const apiArticleEdit = info => service.post('/api/v1/articleEdit', info);

我們定義了一個(gè)apiArticleEdit方法,這個(gè)方法有一個(gè)參數(shù)info,info是我們請(qǐng)求接口時(shí)攜帶的參數(shù)對(duì)象。而后調(diào)用了我們封裝的axios方法,第一個(gè)參數(shù)是我們的接口地址,第二個(gè)參數(shù)是apiArticleEdit的info參數(shù),即請(qǐng)求接口時(shí)攜帶的參數(shù)對(duì)象。最后通過(guò)export導(dǎo)出apiArticleEdit。

然后在我們的頁(yè)面中可以這樣調(diào)用我們的api接口:

import React, { Component } from 'react'
 import { apiArticleEdit } from './request/api'
export default class App extends Component {
  componentDidMount() { 
    // 調(diào)用api接口,并且提供了兩個(gè)參數(shù)
    let params = { type: 2, author: '北孤清茶' }
    apiArticleEdit(params).then(res => { 
      // 獲取數(shù)據(jù)成功后的其他操作
      //.....
      console.log(res)
    })
  }
  render() {
    return (
      <div>
        
      </div>
    )
  }
}

其他的api接口,就在api.js中繼續(xù)往下面擴(kuò)展就可以了。友情提示,為每個(gè)接口寫好注釋哦?。?!

api接口管理的一個(gè)好處就是,我們把a(bǔ)pi統(tǒng)一集中起來(lái),如果后期需要修改接口,我們就直接在api.js中找到對(duì)應(yīng)的修改就好了,而不用去每一個(gè)頁(yè)面查找我們的接口然后再修改會(huì)很麻煩。關(guān)鍵是,萬(wàn)一修改的量比較大。還有就是如果直接在我們的業(yè)務(wù)代碼修改接口,一不小心還容易動(dòng)到我們的業(yè)務(wù)代碼造成不必要的麻煩。

好了,最后把完成的axios封裝代碼奉上。

//在index.js中引入axios
import axios from 'axios';
//引入qs模塊,用來(lái)序列化post類型的數(shù)據(jù)
import QS from 'qs';
//antd的message提示組件,大家可根據(jù)自己的ui組件更改。
import { message } from 'antd'

//保存環(huán)境變量
const isPrd = process.env.NODE_ENV == 'production';

//區(qū)分開(kāi)發(fā)環(huán)境還是生產(chǎn)環(huán)境基礎(chǔ)URL
export const basciUrl = isPrd ? 'https://www.production.com' : 'http://www.development.com'

//設(shè)置axios基礎(chǔ)路徑
const service = axios.create({
  baseURL: basicUrl
})

// 請(qǐng)求攔截器
service.interceptors.request.use(config => { 
  // 每次發(fā)送請(qǐng)求之前本地存儲(chǔ)中是否存在token,也可以通過(guò)Redux這里只演示通過(guò)本地拿到token
  // 如果存在,則統(tǒng)一在http請(qǐng)求的header都加上token,這樣后臺(tái)根據(jù)token判斷你的登錄情況
  // 即使本地存在token,也有可能token是過(guò)期的,所以在響應(yīng)攔截器中要對(duì)返回狀態(tài)進(jìn)行判斷 
  const token = window.localStorage.getItem('userToken') || window.sessionStorage.getItem('userToken');
  //在每次的請(qǐng)求中添加token
  config.data = Object.assign({}, config.data, {
    token: token,
  })
  //設(shè)置請(qǐng)求頭
  config.headers = {
    'Content-Type': 'application/x-www-form-urlencoded; charset=utf-8'
  }
  //序列化請(qǐng)求參數(shù),不然post請(qǐng)求參數(shù)后臺(tái)接收不正常
  config.data = QS.stringify(config.data)
  return config
}, error => { 
    return error;
})

// 響應(yīng)攔截器
service.interceptors.response.use(response => {
  //根據(jù)返回不同的狀態(tài)碼做不同的事情
  // 這里一定要和后臺(tái)開(kāi)發(fā)人員協(xié)商好統(tǒng)一的錯(cuò)誤狀態(tài)碼
  if (response.code) {
    switch (response.code) {
      case 200:
        return response.data;
      case 401:
        //未登錄處理方法
        break;
      case 403:
        //token過(guò)期處理方法
        break;
      default:
        message.error(response.data.msg)
    }
  } else { 
    return response;
  }
})
//最后把封裝好的axios導(dǎo)出
export default service

總結(jié)

到此這篇關(guān)于React項(xiàng)目中axios的封裝與API接口管理的文章就介紹到這了,更多相關(guān)React中axios封裝與API接口內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • react hook使用useState更新數(shù)組,無(wú)法更新問(wèn)題及解決

    react hook使用useState更新數(shù)組,無(wú)法更新問(wèn)題及解決

    這篇文章主要介紹了react hook使用useState更新數(shù)組,無(wú)法更新問(wèn)題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-03-03
  • 淺談python的函數(shù)知識(shí)

    淺談python的函數(shù)知識(shí)

    這篇文章主要為大家介紹了python的函數(shù),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2021-11-11
  • 一文詳解ReactNative狀態(tài)管理redux-toolkit使用

    一文詳解ReactNative狀態(tài)管理redux-toolkit使用

    這篇文章主要為大家介紹了ReactNative狀態(tài)管理redux-toolkit使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-03-03
  • React中的useState和setState的執(zhí)行機(jī)制詳解

    React中的useState和setState的執(zhí)行機(jī)制詳解

    這篇文章主要介紹了React中的useState和setState的執(zhí)行機(jī)制,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-03-03
  • React 狀態(tài)的不變性實(shí)例詳解

    React 狀態(tài)的不變性實(shí)例詳解

    這篇文章主要為大家介紹了React 狀態(tài)的不變性實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-11-11
  • React內(nèi)部實(shí)現(xiàn)cache方法示例詳解

    React內(nèi)部實(shí)現(xiàn)cache方法示例詳解

    這篇文章主要為大家介紹了React內(nèi)部實(shí)現(xiàn)cache方法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-11-11
  • 深入了解響應(yīng)式React Native Echarts組件

    深入了解響應(yīng)式React Native Echarts組件

    近年來(lái),隨著移動(dòng)端對(duì)數(shù)據(jù)可視化的要求越來(lái)越高,通過(guò) WebView 在移動(dòng)端使用 Echarts 這樣功能強(qiáng)大的前端數(shù)據(jù)可視化庫(kù),是解決問(wèn)題的好辦法。下面就和小編來(lái)一起學(xué)習(xí)一下吧
    2019-05-05
  • VSCode 配置React Native開(kāi)發(fā)環(huán)境的方法

    VSCode 配置React Native開(kāi)發(fā)環(huán)境的方法

    本篇文章主要介紹了VSCode 配置React Native開(kāi)發(fā)環(huán)境的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-12-12
  • React前端路由應(yīng)用介紹

    React前端路由應(yīng)用介紹

    前端應(yīng)用大多數(shù)是SPA(單頁(yè)應(yīng)用程序),也就是只有一個(gè)HTML頁(yè)面的應(yīng)用程序。因?yàn)樗挠脩趔w驗(yàn)更好、對(duì)服務(wù)器壓力更小,所以更受歡迎。為了有效的使用單個(gè)頁(yè)面來(lái)管理多頁(yè)面的功能,前端路由應(yīng)運(yùn)而生
    2022-09-09
  • ReactNative 之FlatList使用及踩坑封裝總結(jié)

    ReactNative 之FlatList使用及踩坑封裝總結(jié)

    本篇文章主要介紹了ReactNative 之FlatList使用及踩坑封裝總結(jié),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-11-11

最新評(píng)論