uni-app 使用axios发请求 运行到微信开发者工具报错 Adapter “http‘ is not available in the build

这篇具有很好参考价值的文章主要介绍了uni-app 使用axios发请求 运行到微信开发者工具报错 Adapter “http‘ is not available in the build。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

场景

  • 最近在使用uni-app开发H5移动端,跟往常一样使用axios发请求,做一些全局的请求拦截响应拦截操作

  • uni-app数据存储,uni-ui组件开发,配置axios,vuex。配置了vue.config.js文件做跨域操作

  • 运行到谷歌浏览器一切正常,但是运行到微信开发者工具就开始报错,Adapter-适配器不可用,请求发不出去

  • 最后经过网上一顿找发现答案都是一样,而且还没有解决问题,最后也是用了很久才解决问题

报错图--适配器"http"在buildat ObjectgetAdapter中不可用-请求根本就没有发出去

uni-app 使用axios发请求 运行到微信开发者工具报错 Adapter “http‘ is not available in the build

uni-app 使用axios发请求 运行到微信开发者工具报错 Adapter “http‘ is not available in the build

自己理解

1.很多人说axios不兼容uni-app,这种说法是比较草率的,其实通过改造,uni-app也可以兼容axios

1.axios是基于AJax上面封装一层,原理还是通过小黄人对象来发送请求

2.在微信开发者工具中,微信环境可能把小黄人底层的发送请求写法禁用了,导致请求发不出去,报错找不到

3.网上的解决方案都是说在axios引入地方main.js或者request.js中给axios写一个适配器-或者换版本

4.这种办法是没有从根本解决问题的,请求没有发出去还会报另外一个错buildURL为空找不到

错误解决-请求一样发不出去还会报另外一个错

在引入axios地方写一个适配器

// 解决uni-app Adapter为空问题
// axios.defaults.adapter = function(config) {
//  return new Promise((resolve, reject) => {
//   var settle = require('axios/lib/core/settle');
//   var buildURL = require('axios/lib/helpers/buildURL');
//   uni.request({
//    method: config.method.toUpperCase(),
//    url: config.baseURL + buildURL(config.url, config.params, config.paramsSerializer),
//    header: config.headers,
//    data: config.data,
//    dataType: config.dataType,
//    responseType: config.responseType,
//    sslVerify: config.sslVerify,
//    complete: function complete(response) {
//     response = {
//      data: response.data,
//      status: response.statusCode,
//      errMsg: response.errMsg,
//      header: response.header,
//      config: config
//     };
​
//     settle(resolve, reject, response);
//    }
//   })
//  })
// }

结果

uni-app 使用axios发请求 运行到微信开发者工具报错 Adapter “http‘ is not available in the build

 

当前场景解读

1.为什么不用uni-app官网提供的uni.request(),因为它没有提供请求拦截和响应拦截,不满足。

2.uni-app使用axios做请求

2.1运行谷歌浏览器时

  • 我们是node.js环境,我们需要往常一样在request.js中配置node.js基地址,请求拦截,响应拦截

  • 在vue.config.js文件设置全局环境变量,uni-app官网全局文件有模板写法

  • 因为是浏览器一样是需要跨域的,也要在vue.config.js中配置跨域

  • 为什么使用uni-app数据储存,因为使用uni-app数据存储,原理是浏览器存储。

  • uni-app浏览器存储可以在谷歌浏览器正常使用,浏览器存储不可以在微信开发者工具中使用,不兼容

  • vue.config.js文件设置全局变量-官网全局文件中有例子

chainWebpack: config => {
    config
      .plugin('define')
      .tap(args => {
        args[0]['process.env'].VUE_APP_BASE_API = '"/dev-api"'
        return args
      })
  }

2.2运行微信到开发者工具时

  • 因为是微信开发者工具,微信环境,就没有跨域了,vue.config.js文件会失效,代理也会抛弃

  • 因为微信环境不兼容axios,所以请求发不出去,还会报错-下面有解决方案

  • 在微信环境中,我们request.js文件中的基地址就不能写全局变量了,而应该写字符串ip+端口

正确解决方案

1.把axios全部替换掉,不给用就不用,使用第三方包@escook/request-miniprogram和axios差不多

  • 可以去npm官网搜索这个包,一直往下翻会有这个包的详细用法

  • 这个方法是axios问题解决不了时候才用,我们这里不推荐-下面有axios解决方案

基本代码-在utils下建立requesthttp.js 在main.js中引入(和axios使用差不多-具体看

// 按需导入 $http 请求对象
import { $http } from '@escook/request-miniprogram'
​
// 将按需导入的 $http 挂载到 wx 顶级对象之上,方便全局调用
// wx这个东西是微信小程序里的顶级对象,也就是说所有页面都可以访问wx这个对象
// 所以我所有地方就可以用 wx.$http访问到请求对象了
// wx.$http = $http
​
// 设置基地址
$http.baseUrl = 'https://api-hmugo-web.itheima.net/api/public/v1/'
// process.env.VUE_APP_BASE_API
​
// 在 uni-app 项目中,可以把 $http 挂载到 uni 顶级对象之上,方便全局调用
// 小程序里wx是顶级对象,但是在uniapp中,uni才是顶级对象
uni.$http = $http
​
// 请求开始之前做一些事情
// 因为咱们是uniapp项目,顶级对象不叫wx,叫uni,记得把wx这个改成uni
$http.beforeRequest = function (options) {
  uni.showLoading({
    title: '数据加载中...',
  })
}
​
// 请求完成之后做一些事情
$http.afterRequest = function () {
  uni.hideLoading()
}

2.继续使用axios兼容微信环境-借助第三方包

2.1注意事项

  • 这个方法是博主试过的,可以解决问题,一定要一步步看不要急

  • 有时候uni-app和微信开发者工具会出bug,记得关闭重新打开编译

  • 基于axios上面下了另外一个包,不用控制axios版本,要在axios包中补一个createError.js文件重点

2.2具体实现

2.2.1Hbuilder X中下包axios-miniprogram-adapter

npm i axios-miniprogram-adapter

2.2.2查看项目node_model中axios包下lib/core/文件包

uni-app 使用axios发请求 运行到微信开发者工具报错 Adapter “http‘ is not available in the build

 

2.2.3在request.js文件下添加以下配置

import adapter from 'axios-miniprogram-adapter'
​
// 设置基地址
const request = axios.create({
    // 运行到浏览器时,把这一行注释回来,VUE_APP_BASE_API是在vue.config.js中配置的,官网有
    // baseURL: process.env.VUE_APP_BASE_API,
    // 运行到浏览器时下面一行注释掉
    baseURL: 'http://127.0.0.1:8800',
    // 在微信开发者工具环境中,axios,http是发不出去的,没有跨域,vue.config.js文件也是无效的
    // 基于axios-miniprogram-adapter包给axios中添加一个适配器
    // 运行到浏览器时,下面一行注释掉,axios时可以在浏览器中正常使用的,不需要适配器
    adapter: adapter,
})

2.2.4从uni-app 运行到微信开发者工具,Hbuilder X会报一个错

uni-app 使用axios发请求 运行到微信开发者工具报错 Adapter “http‘ is not available in the build 

2.2.5报错是说,axios-miniprogram-adapter是在引用axios中的包,axios缺少这个包找不到,可以通过点击下面报错来到相应文件夹查看

2.2.6在axios/lib/core创建一个createError.js包给axios-miniprogram-adapter使用就可以解决问题

  • 来到这个目录下创建createError.js文件

  • 把AxiosError.js文件内容直接复制到createError.js文件中即可

uni-app 使用axios发请求 运行到微信开发者工具报错 Adapter “http‘ is not available in the build

 

2.2.7在Hbuilder X重新把项目运行到微信开发者工具就发现没有报错,axios可以使用,请求发出去了

uni-app 使用axios发请求 运行到微信开发者工具报错 Adapter “http‘ is not available in the build

 

2.2.8request.js完整代码-仅供参考最好不要复制

import axios from 'axios'
​
import adapter from 'axios-miniprogram-adapter'
// 引入vuex
import store from '@/store'
​
// 解决uni-app Adapter为空问题-不可行解决不了
// axios.defaults.adapter = function(config) {
//  return new Promise((resolve, reject) => {
//   var settle = require('axios/lib/core/settle');
//   var buildURL = require('axios/lib/helpers/buildURL');
//   uni.request({
//    method: config.method.toUpperCase(),
//    url: config.baseURL + buildURL(config.url, config.params, config.paramsSerializer),
//    header: config.headers,
//    data: config.data,
//    dataType: config.dataType,
//    responseType: config.responseType,
//    sslVerify: config.sslVerify,
//    complete: function complete(response) {
//     response = {
//      data: response.data,
//      status: response.statusCode,
//      errMsg: response.errMsg,
//      header: response.header,
//      config: config
//     };
​
//     settle(resolve, reject, response);
//    }
//   })
//  })
// }
​
// 设置基地址
const request = axios.create({
    // 运行到浏览器时,把这一行注释回来,VUE_APP_BASE_API是在vue.config.js中配置的,官网有
    // baseURL: process.env.VUE_APP_BASE_API,
    // 运行到浏览器时下面一行注释掉
    baseURL: 'http://127.0.0.1:8800',
    // 在微信开发者工具环境中,axios,http是发不出去的,没有跨域,vue.config.js文件也是无效的
    // 基于axios-miniprogram-adapter包给axios中添加一个适配器
    // 运行到浏览器时,下面一行注释掉,axios时可以在浏览器中正常使用的,不需要适配器
    adapter: adapter,
})
​
// 解决UNI-app上adapter is not a function问题
axios.defaults.adapter = function(config) {
    return new Promise((resolve, reject) => {
        console.log(config)
        var settle = require('axios/lib/core/settle');
        var buildURL = require('axios/lib/helpers/buildURL');
        uni.request({
            method: config.method.toUpperCase(),
            url: config.baseURL + buildURL(config.url, config.params, config.paramsSerializer),
            header: config.headers,
            data: config.data,
            dataType: config.dataType,
            responseType: config.responseType,
            sslVerify: config.sslVerify,
            complete: function complete(response) {
                response = {
                    data: response.data,
                    status: response.statusCode,
                    errMsg: response.errMsg,
                    header: response.header,
                    config: config
                };
​
                settle(resolve, reject, response);
            }
        })
    })
}
​
​
// 请求拦截
request.interceptors.request.use(
    config => {
        console.log('store.getters.token', store.getters.token);
        if (store.getters.token) {
            console.log('执行了');
            // config.headers['token'] = getToken()
            // config.headers['tenant-id'] = getuserId()
            // 建议使用uni-app数据同步存储,在谷歌浏览器可以用,但是谷歌浏览器储存在微信开发者工具用了
            config.headers['token'] = uni.getStorageSync('token')
            config.headers['tenant-id'] = uni.getStorageSync('tenant-id')
        }
        return config
    },
    error => {
        return Promise.reject(error)
    }
)
​
​
// 响应拦截
request.interceptors.response.use(
    res => {
        const data = res.data
        if (data.code === 200) {
            // 如果响应成功,则正常给他返回数据
            return data
        } else {
            uni.$showToast(data.message)
            return Promise.reject(new Error(data.message))
        }
    },
    // 响应错误的代码写这里
    async error => {
        // 打印错误拦截的信息
        console.log('响应拦截error', error)
        // error.response 这个是浏览器语法错误返回信息
        // error.response.data 这个是接口返回错误信息 固定写法 看打印
        if (error.response && error.response.data) {
            // token失效携带页面参数返回登录页
            if (error.response.status === 401) {
                // vuex退出登录方法
            } else {
                console.log(error.response.data.message);
                uni.$showToast('请求错误')
            }
        }
        return Promise.reject(error)
    }
)
​
// 把对象暴露出去
export default request

总结:

经过上面操作,axios就可以兼容uni-app和卫星开发者工具,我们只需要在运到浏览器和微信开发者工具是切换基地址配置就可以2端都适配


经过这一趟流程下来相信你也对 uni-app 使用axios发请求 运行到微信开发者工具报错 Adapter "http' is not available in the build 有了初步的深刻印象,但在实际开发中我 们遇到的情况肯定是不一样的,所以我们要理解它的原理,万变不离其宗。加油,打工人!

什么不足的地方请大家指出谢谢 -- 風过无痕文章来源地址https://www.toymoban.com/news/detail-482976.html

到了这里,关于uni-app 使用axios发请求 运行到微信开发者工具报错 Adapter “http‘ is not available in the build的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 详解uni-app项目运行在微信小程序调试

    uni-app项目运行在微信小程序调试 UNI-APP学习系列之详解uni-app项目运行在微信小程序调试 微信小程序工具,【下载地址】 打开下载地址后,选择电脑所用操作系统的稳定版本进行下载并安装。 项目运行在微信小程序 打开HbuilderX,运行 == 运行到小程序或模拟器 == 运行设置 =

    2024年02月15日
    浏览(19)
  • uni-app打包运行成微信小程序,一看就会

     不废话,直接甩步骤: 1.对HX(HBulider X)编译器配置 选择运行配置:设置微信开发者工具的位置 2.uniapp项目配置 找到自己项目的manifest.json,选择微信小程序,填写自己的appid 3.微信开发者工具设置 打开微信小程序的服务端口 设置 - 安全设置 - 打开端口号 4.在HX中编译成微信小

    2024年02月21日
    浏览(28)
  • uni-app运行微信小程序时文件查找失败的问题

    此类问题主要是文件的路径不正确导致的。 造成这种问题的一个比较坑的原因,就是HBuilderX在新建目录的时候会在pages.json中添加路径,如果你修改了路径,pages.json并不会自动更改这个路径,导致无法找到新的路径地址。所以解决这个问题也非常简单,就是在pages.json文件里,

    2024年02月11日
    浏览(26)
  • uni-app运行微信开发工具小程序,出现× initialize报错

     解决方案  

    2024年02月13日
    浏览(17)
  • uni-app运行微信开发工具小程序,出现× initialize报错。

    uni-app运行微信开发工具小程序,出现× initialize报错: 这是由于微信开发者工具服务端口未开启,导致出现 × initialize报错。 打开设置,找到安全设置:      2. 开启服务端口:   

    2024年02月12日
    浏览(22)
  • 【uni-app】只支持在微信小程序运行的 导入外部3d模型

    uniapp 导入3d模型,在微信小程序端运行。只支持在微信小程序端使用,若要支持 h5 和 APP端,可以查看这篇,点击这里 只导入了3d模型,未设置让模型动。 glb 格式 (1)首先文件 下载适配微信小程序的 three.js 地址:https://github.com/wechat-miniprogram/threejs-miniprogram (2)导入文件

    2023年04月08日
    浏览(24)
  • uni-app 使用uni.request封装发送api请求文档服务器请求导航守卫

    前言 刚刚接触uni-app时候想着直接使用axios发请求,可以发送成功但是请求头有点问题 后面发现教程都是使用@escookrequest-miniprogram三方包发送请求-(浏览器环境发送不了请求,不兼容) 为什么不直接用uni.request()发送请求,是因为每次请求都要写一次添加请求头不合理 后面

    2024年02月16日
    浏览(35)
  • 创建一个uni-app项目并运行再浏览器及微信小程序

    第一步: 打开HBuilder X 点击文件列表 新建 项目 第二步: 如图所示(根据项目所需要的进行选择) 第三步: 创建完成之后项目文件的(介绍以及作用) 第四步: 如何将uni-app项目运行到不同的浏览器,我在这里运行的是微信小程序 (1) 点击运行可以查看到项目的多种运行方式 (2

    2024年02月12日
    浏览(22)
  • uni-app 使用@escookrequest-miniprogram请求发送

    前言 在使用uni-app开发小程序时候发现axios添加请求头时在实际网络请求时并没有添加进去 后面发现是有第三方包@escookrequest-miniprogram代替axios发送请求的,请求头也添加正常。 注意是这个包也是在外层包了一层data,但好像并不能统一处理掉。 代码实现 1.下包@escookrequest-min

    2024年02月13日
    浏览(21)
  • 使用uni-app+uview创建小程序工程并支持请求后端接口

    一、使用工具:     1.hubilderx   下载地址:HBuilderX-高效极客技巧     2.微信开发者工具   下载地址:微信开发者工具下载地址与更新日志 | 微信开放文档     3.uview组件库API:Color 色彩 | uView 2.0 - 全面兼容nvue的uni-app生态框架 - uni-app UI框架 二、使用hubuilderx创建uni-app项目

    2024年02月11日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包