最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

React項目中axios的封裝與API接口的管理詳解

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

前言

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

安裝

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

引入

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

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

環(huán)境的切換

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

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

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

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

請求攔截

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

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

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

響應攔截

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

響應攔截器很好理解,就是服務器返回給我們的數(shù)據(jù),我們在拿到之前可以對他進行一些處理。例如上面的思想:如果后臺返回的狀態(tài)碼是200,則正常返回數(shù)據(jù),否則的根據(jù)錯誤的狀態(tài)碼類型進行一些我們需要的錯誤,具體返回的狀態(tài)碼需要處理那些流程還需要跟后臺開發(fā)人員協(xié)商。

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

api的統(tǒng)一管理

整齊的api就像電路板一樣,即使再復雜也能很清晰整個線路。上面說了,我們會新建一個api.js,然后在這個文件中存放我們所有的api接口。

首先我們在api.js中引入我們封裝的axios

//導入我們封裝好的axios 
import service from './index'

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

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

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

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

我們定義了一個apiArticleEdit方法,這個方法有一個參數(shù)info,info是我們請求接口時攜帶的參數(shù)對象。而后調用了我們封裝的axios方法,第一個參數(shù)是我們的接口地址,第二個參數(shù)是apiArticleEdit的info參數(shù),即請求接口時攜帶的參數(shù)對象。最后通過export導出apiArticleEdit。

然后在我們的頁面中可以這樣調用我們的api接口:

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

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

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

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

//在index.js中引入axios
import axios from 'axios';
//引入qs模塊,用來序列化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ū)分開發(fā)環(huán)境還是生產環(huán)境基礎URL
export const basciUrl = isPrd ? 'https://www.production.com' : 'http://www.development.com'

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

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

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

總結

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

相關文章

  • 使用React18和WebSocket構建實時通信功能詳解

    使用React18和WebSocket構建實時通信功能詳解

    WebSocket是一種在Web應用中實現(xiàn)雙向通信的協(xié)議,它允許服務器主動向客戶端推送數(shù)據(jù),而不需要客戶端發(fā)起請求,本文將探索如何在React?18應用中使用WebSocket來實現(xiàn)實時通信,感興趣的可以了解下
    2024-01-01
  • React Hook的使用示例

    React Hook的使用示例

    這篇文章主要介紹了React Hook的使用示例,幫助大家更好的理解和學習使用React,感興趣的朋友可以了解下
    2021-04-04
  • React通過conetxt實現(xiàn)多組件傳值功能

    React通過conetxt實現(xiàn)多組件傳值功能

    Context 提供了一種在組件之間共享此類值的方式,而不必顯式地通過組件樹的逐層傳遞 props。本文給大家介紹React通過conetxt實現(xiàn)多組件傳值功能,感興趣的朋友一起看看吧
    2021-10-10
  • 關于react hook useState連續(xù)更新對象的問題

    關于react hook useState連續(xù)更新對象的問題

    這篇文章主要介紹了關于react hook useState連續(xù)更新對象的問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-03-03
  • react中使用swiper的具體方法

    react中使用swiper的具體方法

    本篇文章主要介紹了react中使用swiper的具體方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-05-05
  • React模擬實現(xiàn)Vue的keepAlive功能

    React模擬實現(xiàn)Vue的keepAlive功能

    Vue中,keep-alive組件可以緩存組件狀態(tài),在路由切換時重新掛載,實現(xiàn)這一功能在React中并不簡單,但我們可以借助一個第三方庫——react-activation 來模擬Vue的keep-alive功能,需要的朋友可以參考下
    2024-10-10
  • React Render Props共享代碼技術

    React Render Props共享代碼技術

    render props是指一種在 React 組件之間使用一個值為函數(shù)的 prop 共享代碼的技術。簡單來說,給一個組件傳入一個prop,這個props是一個函數(shù),函數(shù)的作用是用來告訴這個組件需要渲染什么內容,那么這個prop就成為render prop
    2023-01-01
  • react版模擬亞馬遜人機交互菜單的實現(xiàn)

    react版模擬亞馬遜人機交互菜單的實現(xiàn)

    本文主要介紹了react版模擬亞馬遜人機交互菜單的實現(xiàn),文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • React class和function的區(qū)別小結

    React class和function的區(qū)別小結

    Class組件和Function組件是React中創(chuàng)建組件的兩種主要方式,本文主要介紹了React class和function的區(qū)別小結,具有一定的參考價值,感興趣的可以了解一下
    2023-10-10
  • react中useState改變值不渲染的解決方式

    react中useState改變值不渲染的解決方式

    這篇文章主要介紹了react中useState改變值不渲染的解決方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-12-12

最新評論

阿拉善右旗| 田阳县| 凤翔县| 新田县| 岑溪市| 绥阳县| 寿阳县| 宜宾市| 河南省| 英超| 茂名市| 二连浩特市| 武川县| 汾阳市| 葫芦岛市| 崇文区| 泗阳县| 天柱县| 北辰区| 华宁县| 札达县| 林西县| 日土县| 定襄县| 资源县| 广安市| 新巴尔虎左旗| 南岸区| 文水县| 荆门市| 桐乡市| 镇宁| 博乐市| 开江县| 西峡县| 伊金霍洛旗| 崇义县| 镇巴县| 新密市| 陇川县| 青岛市|