axios

node裏的app.use是在聲明使用一箇中間件,use裏的中間件是個函數,是能夠對咱們的請求或響應作特定處理的函數node

 

這裏是post請求,post請求參數使用請求體攜帶,但請求體攜帶有兩種格式:ios

1.name=tom&&pwd=123  :是urlencoded的形式  這個服務器都接受的  但json格式就不必定express

app.use(express.urlencoded({extended:true}))json

 

2.app.use(express.json()) //請求參數是json結構{name:'tom",pwx:123}axios

本質上都是文本字符串,就是格式不同  後端

 

若是後臺沒有使用2這個中間件,那麼後臺沒法解析Json格式的參數api

 

若是公司項目只支持1的格式,axios默認只用json格式請求體攜帶參數數據,可是後臺不支持promise

axios的data是對象格式,後臺不支持,咱們要把data轉成後臺支持的,不必本身拼瀏覽器

 

post請求體參數格式服務器

1)Content-Type:application/x-www-form-urlencoded;charset=utf-8

  用於鍵值對參數,參數的鍵值用=連接,參數之間用&連接

2)Content-Type:application/json;charset=utf-8

  用於json字符串參數 {name:'fds";pwd:12}

3)Content-Type:multipart/form-data

  用於文件上傳請求

 

axios裏有個工具包  叫qs  安裝好axios後自動帶有qs  

const qs = require('qs')

import qs from 'qs'
const data = {"bar":123}
const option = {
    method:'post',
    headers:{'content-type':'application/x-www-form-urlencoded'}
    data:qs.stringfy(data),
    url
}
axios(option)

但之後每次請求都要qs.stringfy不方便

這時候用axios的一個技術語法,叫攔截器interceptors

axios.interceptors.request.use請求攔截器

axios.interceptors.response.use響應攔截器

 

攔截器本事本質上是個函數

axios.interceptors.request.use(function(config){

})

<script>
import axios from 'axios'
import qs from 'qs'

//添加請求攔截器:讓post請求的請求體格式爲urlencoded格式  a=1&b=2
//在發請求前執行
axios.interceptors.request.use(function(config){
    
    //獲得請求方式和請求體數據
    const {method,data} = config
    //處理post請求,將data對象轉換成query參數格式字符串
    if(method.toLowerCase==='post' && typeof data==='object'){
        config.data = qs.stringify(data)
    }
    return config
})

export default axios

</script>

 

axios是基於promise的

axios({}).then(res=>{}) //res獲得的是返回來的對象,包含一堆東西,有status,data等...

res.data獲得的纔是後端返回給咱們的數據

若是要判斷服務器層面的請求成功與失敗,應該在res.status裏看

這時候用響應攔截器統一判斷

<script> Login.js

 handleSubmit = e => {
        e.preventDefault();
        this.props.form.validateFields((err, values) => {
          if (!err) {
            reqLogin(values).then(res=>{

            },
        err
=>{ //這個是在axios.intercepter.response裏的function(error)裏先執行完後再執行這裏的error 也就是執行了兩次,
              並且信息也是同樣的,是瀏覽器請求失敗的信息,並無拿到後端給的信息,
              因此這裏回調的err沒有什麼用,應該在axios.intercepter裏統一作瀏覽器請求失敗處理,因此這個err函數能夠刪除不用
alert('請求失敗了'+err.message) //使用了return new Promise(()=>{}) 中斷了promise 就不會執行這條了 }) } }); }; axios.js //添加響應攔截器 //讓請求成功的結果再也不是response,而是response.data的值 //在請求返回以後且在咱們指定的請求回調函數以前 axios.interceptors.response.use(function(res){ return res.data //返回的結果就會交給咱們指定的請求響應的回調 },function(err){//統一處理全部請求的異常錯誤 // return Promise.reject(error) alert('請求出錯'+ err.message) //返回一個pending狀態的promise,中斷promise鏈 return new Promise(()=>{}) }) </script>

 api/index.js

<script>
import axios from './axios'

const BASE = ""

// export function reqLogin(param){
//     axios({
//         method:'post',
//         url:BASE+'/login',
//         data:param  
//     })
// }

//寫成箭頭函數的形式
// export const reqLogin = (param)=>{//不要寫{}  寫{},=>就沒有return 的做用了  用()包裹

// }

/*
這個方法能夠:
export const reqLogin = (param) => (
    axios({
        method: 'post',
        url: BASE + '/login',
        data: param
    })
)
*/

//這個也能夠
export const reqLogin = (param) => (axios.post(BASE + '/login', param))

</script>
相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息