axios知识点

get请求 query传参:

 axios 'GET'请求 query传参 写法:
axios.get(`/xxx?id=123456`) // 写法一
axios.get('/xxx', {         // 写法二
  params: {
    id:123456
  }
})
axios({                     // 完整写法
  url:'/xxx',
  method:"GET",
  params:{
    id:123465
  }
})

post请求:

// axios 'POST'请求 请求体 传参 写法:
// 对象写法默认对 JSON.stringify 转换成JSON格式
axios.post('/xxxx', { name: 'zhangsan', age: 18 })
// urlencoded编码的请求
axios.post('/xxxx', 'name=zhangsan&age=18')

axios({ // 完整写法
  url: '/person',
  method: 'POST',
  data: { name: '张三', age18 }
})

// POST 请求携带 query参数 
axios({ // 完整写法
  url: '/person',
  method: 'POST',
  params: {
    a: 1,
    b: 2
  },
  data: { name: '张三', age18 }
})

axios:

axios 基于promise封装的ajax库 [核心还是基于 XMLHttpRequest 发送请求的]
http://www.axios-js.com/zh-cn/docs/
    + 基于axios发送数据请求,返回结果都是一个promise实例
      默认情况下
      + 服务器返回的响应状态是以2开始,则以promise状态为成功,值是一个response对象
        respone={
            config:{...},发送axios请求设置的配置项
            data:{...},服务器返回的响应主体信息
            headers:{...},服务器返回的响应头信息
            request:{...}, 原生的xhr对象
            status:200,服务器响应的HTTP状态码
            statusText:'OK' 状态码的描述
        }
    + promise状态为失败
        1. 服务器有返回信息 [response对象存在] ,只不过HTTP状态码不是以2开始的
         reason={
            config: {...},
            isAxiosError: true,
            request: XMLHttpRequest实例对象,
            response: 等同于成功获取的response对象,
            toJSON: function...,
            message: 'xxx',
            ...
         }
        2. 请求超时 或者 请求中断了
         reason={
            code: "ECONNABORTED",
            response: undefined,
            ...
         }
        3. 断网了,特点:服务器没有反馈任何的信息

    我们可以自定义服务器返回的HTTP状态码为多少是成功,为多少是失败
    axios.get([url],{
        ...,
        // axios的validateStatus配置项,就是自定义promise实例状态是成功的条件
        validateStatus:(status)=>{
            return status >= 200 && status <= 300; // 默认处理机制
        }
    })

+ 基于axios发送请求的方式
  1. axios([config]) 或者 axios([url],[config])
  2. axios.request([config])
  3. axios.get/delete/head/options([url],[config])
  4. axios.post/put/patch([url],[data],[config])  -> [data]基于请求主体传递给服务器的信息
  5. let instance = axios.create([config])
    创建的Instance等同于axios,使用起来和axios一样...
    instance.get([url],[config])
    ...

+ axios发送请求时候的配置项 config
    1. url: 请求的地址  发送求情的时候,但凡没有单独设置url的,都需要在配置项中指定
    2. baseURL:请求地址的通用前缀  最后发送请求的时候,是把baseURL和url拼接在一起发送的
        axios.get('/user/list',{
            baseURl:'http://api.zhufeng.cn'
            ...
        })
        最后发送请求的地址是 'http://api.zhufeng.cn/user/list'
        特殊情况:如果url地址本身已经存在了 http或者https等信息,说明url本身就已经是完整的地址了,baseURL的值
        无需再拼接了
    3. transformRequest:(data,headers)=>{
        // data:自己传递[data]
        // headers:设置的请求头信息{对象}
        return xxx;返回值是啥,最后基于请求主体传递的就是啥
        }
        它只针对POST系列请求,把我们自己传递的[data]格式化为指定的格式,后期再基于请求主体发送给服务器
        axios内部做了一个处理,根据我们最后处理好的[data]的格式,自动设置请求头中的Content-Type中值
        1. 客户端基于请求主体传递给服务器的数据格式
            + form-data    Content-Type:multipart/form-data 主要应用于文件上传/表单提交
            + urlencoded   Content-Type:application/x-www.form-urlencoded
              GET系列请求:是基于URL问号传参把信息传递给服务器的 ?xxx=xxx&xxx=xxx
              xxx=xxx&xxx=xxx 这种字符串就是urlencoded格式字符串
            + raw 泛指,代指文本格式 [含:普通文本字符串、JSON格式字符串...]
              普通字符串 Content-Type:text/plain
              JSOn字符串 Content-Type:application/json
              ...
            + binary 二进制格式数据  主要应用于文件上传
        2. axios内部在默认情况下,如果我们[data]传递的是个普通对象,而且也没有经过transformRequest处理,则
            内部默认会把对象变为JSON格式字符串传递给服务器
    4.  transformResponse:data=>{
         // data:从服务器获取的结果,而且是响应主体信息[服务器响应主体返回的信息一般都是JSON格式字符串]
         return data
        }
        在我们自己的.then/catch之前,对服务器返回的结果进行修改

    5.  headers:{...}  自定义请求头信息
   
    6.  params:{...} GET系列请求,基于URL问号参数,把信息传递给服务器;我们params一般设置为对象,axios内部会把
        对象变为urlencoded 格式拼接到URL的末尾
    
    7.  data:{....} POST系列请求,基于请求主体传递的信息...
   
    8.  timeout:0 设置超时时间,写0就是不设置

    9.  withCredentials:false 在CORS跨域请求中,是否允许携带资源凭证

    10. responseType: 把服务器返回的结果设置为指定的格式 'arraybuffer','blob','document','json'[默认],'text','stream'...
   
    11. onUploadProgress:onUploadProgress=>{}
        onDownloadProgress:onDownloadProgress=>{}
    
    12. validateStatus:status=>status >= 200 && status < 300;
        定义服务为返回的状态码是多少,promise实例是成功的

    ...
    

axios请求的取消,依赖于 axios.CancelToken 完成
 const source= axios.CancelToken.soure();
 axios.get([url],{
    ...
    cancelToken: source.token
 }).catch(reason=>{
    // 取消后,promise实例是失败的
 })

 soure.cancel('...') 取消发送


+ axios中拦截器
  请求拦截器: 当axios把各方面配置都处理好了,在即将基于这些配置项服务器发送请求的时候,触发请求拦截器
  axios.interceptors.request.use(config=>{
    // config存储的是anxios处理好的配置,我们一般在请求拦截器中修改配置
    // ....
    return config
  })

  响应拦截器:服务器返回结果,axios已经知道返回的promise实例状态是成功还是失败了,在自己调用 .then/catch
   之前,先根据promise状态,把响应拦截器中设置的方法执行!
    axios.interceptors.response.use(
    response=>{
        // promise实例是成功的, 执行这个方法:  response存储服务器返回的结果
    },
    reason=>{
        // promise实例是失败的, 执行这个方法:  response存储失败的原因 
    }
  )

axios.get([url],[config])
    .then(value=>{})
    .catch(reason=>{})

md5加密:
下载: npm i blueimp-md5
导入: import md5 from "blueimp-md5"
使用:  password: md5(xxx)

axios二次封装

        100 个请求

        其中大部分请求发送的时候要干的事情,我们都需要提取出来

常用的请求有 ajax 、$.ajax 、  axios   、fetch

ajax原生ajax四步 [ XMLHttpRequest ]

$.ajax JQ中基于回调函数的方式,对ajax四步操作的封装,核心AXMLHttpRequest

$.ajax({
    url:'',
    success(resule){
    // ...
    }
})

axios基于promise对XMLHttpRequest的封装

axios.get('',{}).then(res=>{}).catch(err=>{})

fetch是ES6内置的API,和XMLHttpRequest没有关系,它是基于新的通信机制实现客户端和服务器端通信的

fetch本身就是基于promise管理的

二次封装:引入公共的配置项(base.js),在单独做处理

vue.config.js:

module.exports = {
    devServer: {
        proxy: {
            '/api': {
                target: 'http://127.0.0.1:9988',
                ws: true,
                changeOrigin: true,
                pathRewrite: {
                    '^/api': ''
                }
            },
            '/jianshu': {
                target: 'https://www.jianshu.com/asimov',
                ws: true,
                changeOrigin: true,
                pathRewrite: {
                    '^/jianshu': ''
                }
            }
        }
    }
}

base.js: 

// 提取多套配置项公共的部分
import utils from "@/assets/utils";
import { ElMessage } from "element-plus";
const {  storage } = utils


export default function baseConfig(instance) {
    instance.defaults.baseURL = ''
    instance.defaults.timeout = 60000
    instance.defaults.validateStatus = status => {
        return status >= 200 && status <= 400
    }

    // 拦截器
    instance.interceptors.request.use((config) => {
        // config: 目前处理好的配置项
        let token = storage.get('token')
        if (token) config.headers.authorzation = token
    
        // 最后会按照return的配置项发送请求
        return config
    })
    
    
    // 响应拦截器: 请求结束(返回一个promise实例),再即将执行我们设定的then/catch之前,触发响应拦截器
    instance.interceptors.response.use(response => {
        // 请求成功后:我们返回响应主体信息
        return response.data
    }, reason => {
        // 请求失败后:根据不同的失败情况,做不同的提示
        let status = reason?.response?.status,
            code = reason?.code
        if (status) {
            //  服务器有返回结果,但是状态码没有经过 validateStatus的校验
            switch (+status) {
                case 404:
                    ElMessage.error('请求地址不存在')
                    break;
                case 500:
                    ElMessage.error('服务器发生了未知错误,请联系管理员')
                    break;
            }
        } else if (code === 'ECONNREFUSED') {
            ElMessage.error('当前请求已超时,请稍后再试~~')
            // 请求超时, err.code='ECONNREFUSED'
        } else if (axios.isCancel(reason)) {
            // 请求中断
            ElMessage.error('当前请求被中断了,请检查代码~~')
        } else {
            // 断网处理
            ElMessage.error('当前网络繁忙,请稍后再试~~')
        }
    
    
        // 提示过后,还是继续执行用户自己设定的catch方法
        return Promise.reject(reason)
    })
    
}

http.js(访问CRM):

基于baseURL二次封装:
import axios from "axios"
import baseConfig from "./base";
import qs from "qs";
import utils from "@/assets/utils";
import { ElMessage } from "element-plus";
const { isPlainObject} = utils


const http = axios.create()
baseConfig(http)
http.defaults.baseURL = "/api"

http.defaults.transformRequest = data => {
    if (isPlainObject(data)) data = qs.stringify(data)
    return data
}

export default http



单独请求:

/* import axios from "axios";
import qs from "qs";
import utils from "@/assets/utils";
import { ElMessage } from "element-plus";
const { isPlainObject, storage } = utils

// 创建和axios类似的一个实例,之前基于axios.xxx()发送请求,现在也可以基于http.xxx()发送请求,语法一致
const http = axios.create({
    baseURL: '/api',
    timeout: 60000
})
// 只针对于POST系列请求的,请求主体内容进行格式化处理:按照后台的要求处理: 
// 不设置transformRequest,会把data对象转换为JSON字符传传递给服务器; Axios内部会识别常用的数据格式,自动设置请求头中的Content-Type
http.defaults.transformRequest = data => {
    if (isPlainObject(data)) data = qs.stringify(data)
    return data
}
http.defaults.validateStatus = status => {
    return status >= 200 && status <= 400
}

// 请求拦截器: 在所有配置项处理完,即将按照配置项向服务器发送请求之前,先执行请求拦截器中,我们在请求拦截器中,可以处理好的配置项再进行修改

http.interceptors.request.use((config) => {
    // config: 目前处理好的配置项
    let token = storage.get('token')
    if (token) config.headers.authorzation = token

    // 最后会按照return的配置项发送请求
    return config
})


// 响应拦截器: 请求结束(返回一个promise实例),再即将执行我们设定的then/catch之前,触发响应拦截器
http.interceptors.response.use(response => {
    // 请求成功后:我们返回响应主体信息
    return response.data
}, reason => {
    // 请求失败后:根据不同的失败情况,做不同的提示
    let status = reason?.response?.status,
        code = reason?.code
    if (status) {
        //  服务器有返回结果,但是状态码没有经过 validateStatus的校验
        switch (+status) {
            case 404:
                ElMessage.error('请求地址不存在')
                break;
            case 500:
                ElMessage.error('服务器发生了未知错误,请联系管理员')
                break;
        }
    } else if (code === 'ECONNREFUSED') {
        ElMessage.error('当前请求已超时,请稍后再试~~')
        // 请求超时, err.code='ECONNREFUSED'
    } else if (axios.isCancel(reason)) {
        // 请求中断
        ElMessage.error('当前请求被中断了,请检查代码~~')
    } else {
        // 断网处理
        ElMessage.error('当前网络繁忙,请稍后再试~~')
    }


    // 提示过后,还是继续执行用户自己设定的catch方法
    return Promise.reject(reason)
})

export default http

 */

http2.js(访问简书):

基于baseURL二次封装:
import axios from "axios"
import baseConfig from "./base";
const http2 = axios.create()
baseConfig(http2)

http2.defaults.baseURL = '/jianshu'
export default http2


单独请求:
/* import axios from "axios";
import qs from "qs";
import utils from "@/assets/utils";
import { ElMessage } from "element-plus";
const { isPlainObject, storage } = utils

// 创建和axios类似的一个实例,之前基于axios.xxx()发送请求,现在也可以基于http.xxx()发送请求,语法一致
const http2 = axios.create({
    baseURL: '/jianshu',
    timeout: 60000
})

// http.defaults.transformRequest = data => {
//     if (isPlainObject(data)) data = qs.stringify(data)
//     return data
// }
// http.defaults.validateStatus = status => {
//     return status >= 200 && status <= 400
// }


http2.interceptors.request.use((config) => {
    // let token = storage.get('token')
    // if (token) config.headers.authorzation = token

    return config
})


// 响应拦截器: 请求结束(返回一个promise实例),再即将执行我们设定的then/catch之前,触发响应拦截器
http2.interceptors.response.use(response => {
    // 请求成功后:我们返回响应主体信息
    return response.data
}, reason => {
    // 请求失败后:根据不同的失败情况,做不同的提示
    let status = reason?.response?.status,
        code = reason?.code
    if (status) {
        //  服务器有返回结果,但是状态码没有经过 validateStatus的校验
        switch (+status) {
            case 404:
                ElMessage.error('请求地址不存在')
                break;
            case 500:
                ElMessage.error('服务器发生了未知错误,请联系管理员')
                break;
        }
    } else if (code === 'ECONNREFUSED') {
        ElMessage.error('当前请求已超时,请稍后再试~~')
        // 请求超时, err.code='ECONNREFUSED'
    } else if (axios.isCancel(reason)) {
        // 请求中断
        ElMessage.error('当前请求被中断了,请检查代码~~')
    } else {
        // 断网处理
        ElMessage.error('当前网络繁忙,请稍后再试~~')
    }


    // 提示过后,还是继续执行用户自己设定的catch方法
    return Promise.reject(reason)
})

export default http2

 */

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值