• axios面试题


    谈谈你对axios的理解?

    axios是基于XMLHttpRequest服务来执行HTTP请求,支持Promise。

    它可以拦截请求和响应

    可以转换请求数据和响应数据,对响应的内容进行自动转换

    axios拦截器的原理?

    Axios.prototype.request是真正的请求

    在Axios.prototype.request维护一个数组

    将request请求拦截器放到数组的前面,将response响应拦截器放到数组的后面,

    组成Promise链式调用

    function Axios(){
        this.interceptors = {
            //两个拦截器
            request: new interceptorsManner(),
            response: new interceptorsManner()
        }
    }
    //真正的请求
    Axios.prototype.request = function(){
        let chain = [dispatchRequest, undefined];//这儿的undefined是为了补位,因为拦截器的返回有两个
        let promise = Promise.resolve();
        //将两个拦截器中的回调加入到chain数组中
        this.interceptors.request.handler.forEach((interceptor)=>{
            chain.unshift(interceptor.fulfilled, interceptor.rejected);
        })
        this.interceptors.response.handler.forEach((interceptor)=>{
            chain.push(interceptor.fulfilled, interceptor.rejected);
        })
        while(chain.length){
            //promise.then的链式调用,下一个then中的chain为上一个中的返回值,每次会减去两个
            //这样就实现了在请求的时候,先去调用请求拦截器的内容,再去请求接口,返回之后再去执行响应拦截器的内容
            promise = promise.then(chain.shift(),chain.shift());
        }
    }
    function interceptorsManner(){
        this.handler = [];
    }
    interceptorsManner.prototype.use = function(fulfilled,rejected){
        //将成功与失败的回调push到handler中
        this.handler.push({
            fulfilled: fulfilled,
            rejected: rejected
        })
    }
    //类似方法批量注册,实现多种请求
    util.forEach(["get","post","delete"],(methods)=>{
        Axios.prototype[methods] = function(url,config){
            return this.request(util.merge(config||{},{//合并
                method: methods,
                url: url
            }))
        }
    })

    为什么支持浏览器中发送请求也支持node发送请求?

    使用的是适配器模式

    1. 在default.js文件中判断环境,然后根据环境使用对应的适配器
    2. 在 axios.defaults.adapter 中可以找到

    简单实现一个对axios的封装?

    import axios from 'axios'
    
    // 配置创建实例
    const service = axios.create({
        baseUrl: '',
        timeout: '',
        headers: {}
    })
    
    // 请求拦截器
    service.interceptors.request.use(
        config => {
            if(token){
                config.headers.token = token
            }
            return config
        },
        error => {
            return Promise.reject(error)
        }
    )
    
    // 响应拦截器
    service.interceptor.response.use(
        response => {
            let res = response
            switch (res.data.code){
                case 200: 
                    return res.data
                    break;
            }
        },
        error => {
            return Promise.reject(error)
        }
    )
    
    export default service

    axios有哪些常用方法?
    一、axios.get(url[, config]) //get请求用于列表和信息查询
    二、axios.delete(url[, config]) //删除
    三、axios.post(url[, data[, config]]) //post请求用于信息的添加
    四、axios.put(url[, data[, config]]) //更新操作

    说下axios的相关配置属性?

    url 适用于请求的服务器URL

    baseURL 将自动加url在前面,除非url是一个绝对URL,

    responseType 表示浏览器将要的相应数据类型,默认值:json,还包括其他:arraybuffer、document、json、text、stream

    transformRequest 允许在向服务器发送前,修改请求数据,只能用在put、post、patch这几个请求方法

    headers 即将被发送的自定义请求头

    params 即将于请求一起发送的url参数,必须是个无格式对象或URLSearchParams对象

    auth 表示HTTP基础验证应当用于连接处理,并提供凭据,这将设置一个Authorization头,覆盖掉已有的Authorization头

    proxy 定义代理服务器的主机名和端口

    proxy: {
        host: '127.0.0.1',
        port: 9000,
        auth: {
            username: 'admin',
            password: '123456'
        }    
    }
  • 相关阅读:
    mac安装和启动mongodb
    Promise
    Vue 对象更改检测注意事项
    Vue 改变数组触发视图更新
    MBE风格图标
    为什么vue中的data用return返回
    数据库补充知识之sql编程
    第一阶段:Python开发基础 day45 数据库基础知识之子查询视图的相关操作事务和游标等
    第一阶段:Python开发基础 day44 数据库基础知识之多表查询
    第一阶段:Python开发基础 day43 数据库基础知识之多表操作
  • 原文地址:https://www.cnblogs.com/naturl/p/16263371.html
Copyright © 2020-2023  润新知