草庐IT

uni-app的h5/小程序/app 网络请求,解决本地环境和生产环境网络请求问题

多思考多学习 2023-04-14 原文

本篇的重点在于解决h5/小程序/app这三端在本地和生产环境的网络请求问题
全部代码贴在了全文最后

思路:

首先要理解这三个端的特性,h5会有跨域问题需要反向代理,小程序和app不需要反向代理,同时小程序还得用https域名。

一、h5,

一般会跨域需要反向代理。所以要在mainifest.json设置反向代理。在请求接口时,还得拼个/api前缀

// 配置代理
 "devServer" : {
     "proxy" : {
         "/api" : {
             "target" : "http://192.168.1.193:8999",
             "changeOrigin" : true, //是否跨域
             "secure" : false, // 设置支持https协议的代理
             "pathRewrite" : {
                 "^/api" : ""
             }
         }
     }
 }
let url ='/api/system/login'

本地调试是loacalhost:808几,

正式环境的话,会变成ip或域名前缀+/api/system/login,后端需要配置一下nginx代理,将api替换一下

二、小程序

不需要反向代理,直接请求。所以请求接口不需要拼api前缀。
但需要https域名,所以本地环境测试时开启‘不校验合法域名……’
1.在微信开发者工具,点击详情>本地设置

2.开启‘不校验合法域名……’

在微信公众平台https://mp.weixin.qq.com/ ,扫码登录小程序,点击开发>开发管理,找到服务器域名,

// #ifdef MP
if (process.env.NODE_ENV === 'development') {
	BASE_URL = "http://192.168.1.193:8999"
} else {
	BASE_URL = "https://www.baidu.com"
}
// #endif

小程序本地环境,request网络请求地址是后台服务地址,接口不要/api前缀

let url = BASE_URL + '/system/login'

小程序生产环境,request网络请求地址要https://域名,并且要api前缀,因为域名一般对应的是前端页面,域名+api后缀,api经过了后端nginx替换,就表示是后端服务地址

let url = BASE_URL + '/api/system/login'

拓展:如果要修改 request 合法域名
注意:
① 域名只支持 https 协议
② 域名不能使用 IP 地址或 localhost
③ 域名必须经过 ICP 备案
④ 服务器域名一个月内最多可申请 5 次修改

三、app

不需要反向代理,直接请求。所以请求接口不需要拼api前缀

// #ifdef APP-PLUS
BASE_URL = "http://192.168.1.193:8999"
// #endif
let url = BASE_URL + '/system/login'

request.js全部代码:

import $common from './common.js';//vuex
// import $store from '../store/index.js';//vuex
// 全局请求路径,也就是后端的请求基准路径
let BASE_URL = ""
// #ifdef H5
BASE_URL = process.env.BASE_API
// #endif
// #ifdef APP-PLUS
BASE_URL = "http://192.168.1.193:8999"
// #endif
// #ifdef MP
if (process.env.NODE_ENV === 'development') {
    BASE_URL = "http://192.168.1.193:8999"
} else {
    BASE_URL = "https://www.baidu.com"
}
// #endif
const request = (options = {}) => {
    options.url = !BASE_URL ? options.url : (BASE_URL + options.url)
    options.header = options.headers
    options.data = options.data
    options['sslVerify'] = false
    let TOKEN = $common.getStorage("token") //TOKEN
    if (TOKEN) {
        if (options.headers) {
            options.headers['Authorization'] = TOKEN;
        } else {
            options.headers = {
                "Content-type": "application/json;charset=utf-8",
            },
                options.headers['Authorization'] = TOKEN;
            options.header = options.headers
        }
    }
    return new Promise((resolve, reject) => {
        console.log("options", options);
        options.success = function (res) {
            console.log("res", res);
            let code = res.data.code;
            uni.hideLoading();
            if (code != 200) {
                if (['401', 'B0005', 'A0076'].indexOf(code) != -1) {
                    //清空token
                    uni.removeStorageSync("token");
                    uni.removeStorageSync("sysUser");
                    uni.showToast({
                        title: '登陆失效',
                        duration: 2000,
                        icon: 'none',
                    });
                }
            }
            //系统异常
            if (code == "B0001") {
                uni.showToast({
                    title: '请求失败,请稍后重试',
                    duration: 2000,
                    icon: 'none',
                });
                return;
            }
            resolve(res)
        }
        options.fail = function (err) {
            console.log("err", err);
            uni.hideLoading();
            reject(err)
        }
        uni.request(options)
    })
}
export default request

有关uni-app的h5/小程序/app 网络请求,解决本地环境和生产环境网络请求问题的更多相关文章

  1. ruby - 使用 C 扩展开发 ruby​​gem 时,如何使用 Rspec 在本地进行测试? - 2

    我正在编写一个包含C扩展的gem。通常当我写一个gem时,我会遵循TDD的过程,我会写一个失败的规范,然后处理代码直到它通过,等等......在“ext/mygem/mygem.c”中我的C扩展和在gemspec的“扩展”中配置的有效extconf.rb,如何运行我的规范并仍然加载我的C扩展?当我更改C代码时,我需要采取哪些步骤来重新编译代码?这可能是个愚蠢的问题,但是从我的gem的开发源代码树中输入“bundleinstall”不会构建任何native扩展。当我手动运行rubyext/mygem/extconf.rb时,我确实得到了一个Makefile(在整个项目的根目录中),然后当

  2. ruby-on-rails - Rails HTML 请求渲染 JSON - 2

    在我的Controller中,我通过以下方式在我的index方法中支持HTML和JSON:respond_todo|format|format.htmlformat.json{renderjson:@user}end在浏览器中拉起它时,它会自然地以HTML呈现。但是,当我对/user资源进行内容类型为application/json的curl调用时(因为它是索引方法),我仍然将HTML作为响应。如何获取JSON作为响应?我还需要说明什么? 最佳答案 您应该将.json附加到请求的url,提供的格式在routes.rb的路径中定义。这

  3. ruby - RuntimeError(自动加载常量 Apps 多线程时检测到循环依赖 - 2

    我收到这个错误:RuntimeError(自动加载常量Apps时检测到循环依赖当我使用多线程时。下面是我的代码。为什么会这样?我尝试多线程的原因是因为我正在编写一个HTML抓取应用程序。对Nokogiri::HTML(open())的调用是一个同步阻塞调用,需要1秒才能返回,我有100,000多个页面要访问,所以我试图运行多个线程来解决这个问题。有更好的方法吗?classToolsController0)app.website=array.join(',')putsapp.websiteelseapp.website="NONE"endapp.saveapps=Apps.order("

  4. ruby-on-rails - 每次我尝试部署时,我都会得到 - (gcloud.preview.app.deploy) 错误响应 : [4] DEADLINE_EXCEEDED - 2

    我是Google云的新手,我正在尝试对其进行首次部署。我的第一个部署是RubyonRails项目。我基本上是在关注thisguideinthegoogleclouddocumentation.唯一的区别是我使用的是我自己的项目,而不是他们提供的“helloworld”项目。这是我的app.yaml文件runtime:customvm:trueentrypoint:bundleexecrackup-p8080-Eproductionconfig.ruresources:cpu:0.5memory_gb:1.3disk_size_gb:10当我转到我的项目目录并运行gcloudprevie

  5. ruby - 是否可以覆盖 gemfile 进行本地开发? - 2

    我们的git存储库中目前有一个Gemfile。但是,有一个gem我只在我的环境中本地使用(我的团队不使用它)。为了使用它,我必须将它添加到我们的Gemfile中,但每次我checkout到我们的master/dev主分支时,由于与跟踪的gemfile冲突,我必须删除它。我想要的是类似Gemfile.local的东西,它将继承从Gemfile导入的gems,但也允许在那里导入新的gems以供使用只有我的机器。此文件将在.gitignore中被忽略。这可能吗? 最佳答案 设置BUNDLE_GEMFILE环境变量:BUNDLE_GEMFI

  6. ruby-on-rails - 如何重命名或移动 Rails 的 README_FOR_APP - 2

    当我在我的Rails应用程序根目录中运行rakedoc:app时,API文档是使用/doc/README_FOR_APP作为主页生成的。我想向该文件添加.rdoc扩展名,以便它在GitHub上正确呈现。更好的是,我想将它移动到应用程序根目录(/README.rdoc)。有没有办法通过修改包含的rake/rdoctask任务在我的Rakefile中执行此操作?是否有某个地方可以查找可以修改的主页文件的名称?还是我必须编写一个新的Rake任务?额外的问题:Rails应用程序的两个单独文件/README和/doc/README_FOR_APP背后的逻辑是什么?为什么不只有一个?

  7. ruby - 用 Ruby 编写一个简单的网络服务器 - 2

    我想在Ruby中创建一个用于开发目的的极其简单的Web服务器(不,不想使用现成的解决方案)。代码如下:#!/usr/bin/rubyrequire'socket'server=TCPServer.new('127.0.0.1',8080)whileconnection=server.acceptheaders=[]length=0whileline=connection.getsheaders想法是从命令行运行这个脚本,提供另一个脚本,它将在其标准输入上获取请求,并在其标准输出上返回完整的响应。到目前为止一切顺利,但事实证明这真的很脆弱,因为它在第二个请求上中断并出现错误:/usr/b

  8. ruby-on-rails - 在 Rails 开发环境中为 .ogv 文件设置 Mime 类型 - 2

    我正在玩HTML5视频并且在ERB中有以下片段:mp4视频从在我的开发环境中运行的服务器很好地流式传输到chrome。然而firefox显示带有海报图像的视频播放器,但带有一个大X。问题似乎是mongrel不确定ogv扩展的mime类型,并且只返回text/plain,如curl所示:$curl-Ihttp://0.0.0.0:3000/pr6.ogvHTTP/1.1200OKConnection:closeDate:Mon,19Apr201012:33:50GMTLast-Modified:Sun,18Apr201012:46:07GMTContent-Type:text/plain

  9. jquery - 我的 jquery AJAX POST 请求无需发送 Authenticity Token (Rails) - 2

    rails中是否有任何规定允许站点的所有AJAXPOST请求在没有authenticity_token的情况下通过?我有一个调用Controller方法的JqueryPOSTajax调用,但我没有在其中放置任何真实性代码,但调用成功。我的ApplicationController确实有'request_forgery_protection'并且我已经改变了config.action_controller.consider_all_requests_local在我的environments/development.rb中为false我还搜索了我的代码以确保我没有重载ajaxSend来发送

  10. Vscode+Cmake配置并运行opencv环境(Windows和Ubuntu大同小异) - 2

    之前在培训新生的时候,windows环境下配置opencv环境一直教的都是网上主流的vsstudio配置属性表,但是这个似乎对新生来说难度略高(虽然个人觉得完全是他们自己的问题),加之暑假之后对cmake实在是爱不释手,且这样配置确实十分简单(其实都不需要配置),故斗胆妄言vscode下配置CV之法。其实极为简单,图比较多所以很长。如果你看此文还配不好,你应该思考一下是不是自己的问题。闲话少说,直接开始。0.CMkae简介有的人到大二了都不知道cmake是什么,我不说是谁。CMake是一个开源免费并且跨平台的构建工具,可以用简单的语句来描述所有平台的编译过程。它能够根据当前所在平台输出对应的m

随机推荐