前端 axios 请求多个域名配置,和请求并发问题
<p>废话不多说,上干货。</p><p>这里只说逻辑,和附带部分重要代码。</p>
<h2>1.配置多个域名</h2>
<p>在项目开发中 分生产环境,和开发环境,所以我们配置多个域名也要分本地和生产</p>
<h4> 本地开发配置:<span style="color: rgba(255, 0, 0, 1)">在请求反向代理的地方 通过请求接口的前缀区分 当前要请求转发到那个域名去获取资源</span></h4>
<p>api.js(封装api调用)</p>
<p><strong>这里主要做两步</strong></p>
<p>1.设置接口前缀,让在本地开发环境下完成多域名请求配置</p>
<p>2.给所有接口一个标识 domainName(主要是后面针对生产环境下的代码逻辑使用)</p>
<div class="cnblogs_code">
<pre>import request from '@/utils/request'
import domainName from '@/utils/domainName'
<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 请求代理中 /v3域名资源</span>
export <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> userColors (data) {
</span><span style="color: rgba(0, 0, 255, 1)">return</span> request({url: '/v3/vehicle/colors',method: 'GET',domainName:domainName.domainNameA<span style="color: rgba(0, 0, 0, 1)">})
}
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 请求代理中 /prod域名资源</span>
export <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> userUpdate (data) {
</span><span style="color: rgba(0, 0, 255, 1)">return</span> request({url: '/prod/user/update',method: 'POST',data,domainName:domainName.domainNameB<span style="color: rgba(0, 0, 0, 1)">})
}
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 请求代理中 /test域名资源</span>
export <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> userCircles (data) {
</span><span style="color: rgba(0, 0, 255, 1)">return</span> request({url: '/test/user/circles',method: 'POST'<span style="color: rgba(0, 0, 0, 1)">,data,domainName:domainName.domainNameC})
}
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 请求 /config域名资源</span>
export <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> userBan (data) {
</span><span style="color: rgba(0, 0, 255, 1)">return</span> request({url: '/config/user/ban',method: 'POST',data,domainName:domainName.domainNameD<span style="color: rgba(0, 0, 0, 1)">})
}</span></pre>
</div>
<p> </p>
<p>domainName.js</p>
<div class="cnblogs_code">
<pre>module.exports =<span style="color: rgba(0, 0, 0, 1)"> {
domainNameA:</span>'domainNameA'<span style="color: rgba(0, 0, 0, 1)">,
domainNameB:</span>'domainNameB'<span style="color: rgba(0, 0, 0, 1)">,
domainNameC:</span>'domainNameC'<span style="color: rgba(0, 0, 0, 1)">,
domainNameD:</span>'domainNameD'<span style="color: rgba(0, 0, 0, 1)">
}</span></pre>
</div>
<p> </p>
<p>配置多个反向代理,实现请求不同域名资源</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)"> proxy: {
</span>'/config': {
<span style="color: rgba(0, 0, 0, 1)"> target: 'https://xxxx4',</span>
changeOrigin: <span style="color: rgba(0, 0, 255, 1)">true</span>, <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 如果接口跨域,需要进行这个参数配置</span>
<span style="color: rgba(0, 0, 0, 1)"> pathRewrite: {
</span>'^/config': ''<span style="color: rgba(0, 0, 0, 1)">
}
},
</span>'/test': {
<span style="color: rgba(0, 0, 0, 1)"> target: 'https://xxxx3',
changeOrigin: </span><span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">,
pathRewrite: {
</span>'^/test': ''<span style="color: rgba(0, 0, 0, 1)">
}
},
</span>'/prod': {
<span style="color: rgba(0, 0, 0, 1)"> target: 'https://xxxx2',
changeOrigin: </span><span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">,
pathRewrite: {
</span>'^/prod': ''<span style="color: rgba(0, 0, 0, 1)">
}
},
</span>'/v3'<span style="color: rgba(0, 0, 0, 1)">: {
target: </span>'https://xxxx1'<span style="color: rgba(0, 0, 0, 1)">,
changeOrigin: </span><span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">,
pathRewrite: {
</span>'^/v3': ''<span style="color: rgba(0, 0, 0, 1)">
}
},
},</span></pre>
</div>
<p> </p>
<h4> 生产环境配置:<span style="color: rgba(255, 0, 0, 1)">在打包上线后反向代理自动失效,并且会通过下面的条件进行 请求对应的域名</span></h4>
<p><span style="color: rgba(136, 136, 136, 1)">axios配置封装</span></p>
<div class="cnblogs_code">
<pre>// 这里原来咋个写 现在还是咋个写 如果你不给接口打上域名标识,那么默认就会去请求这个配置里的域名资源<br>const service =<span style="color: rgba(0, 0, 0, 1)"> axios.create({
baseURL: process.env.NODE_ENV </span>=== 'development' ? '/test' :'https:生产域名', <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> api 的 base_url</span>
timeout: 5000 <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> request timeout</span>
<span style="color: rgba(0, 0, 0, 1)">})
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 请求拦截设置统一header</span>
<span style="color: rgba(0, 0, 0, 1)">service.interceptors.request.use(
config </span>=><span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 生产环境生效 下面的代码 实现具体接口请求具体域名的地址和资源</span>
<span style="color: rgba(0, 0, 255, 1)">if</span>(process.env.NODE_ENV === 'production' &&<span style="color: rgba(0, 0, 0, 1)"> config.domainName){
</span><span style="color: rgba(0, 0, 255, 1)">if</span>(config.domainName === 'domainNameA'<span style="color: rgba(0, 0, 0, 1)">){
config.baseURL </span>= 'https:xxxx1'<span style="color: rgba(0, 0, 0, 1)">
} </span><span style="color: rgba(0, 0, 255, 1)">else</span> <span style="color: rgba(0, 0, 255, 1)">if</span>(config.domainName === 'domainNameB'<span style="color: rgba(0, 0, 0, 1)">){
config.baseURL </span>= 'https:xxxx2'<span style="color: rgba(0, 0, 0, 1)">
}</span><span style="color: rgba(0, 0, 255, 1)">else</span> <span style="color: rgba(0, 0, 255, 1)">if</span>(config.domainName === 'domainNameC'<span style="color: rgba(0, 0, 0, 1)">){
config.baseURL </span>= 'https:xxxx3'<span style="color: rgba(0, 0, 0, 1)">
}</span><span style="color: rgba(0, 0, 255, 1)">else</span> <span style="color: rgba(0, 0, 255, 1)">if</span>(config.domainName === 'domainNameD'<span style="color: rgba(0, 0, 0, 1)">){
config.baseURL </span>= 'https:xxxx4'<span style="color: rgba(0, 0, 0, 1)">
}
}
</span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> config;
},
error </span>=><span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> Promise.reject(error)
}
)</span></pre>
</div>
<p> </p>
<h2>2.请求并发 并且等待全部完成回调</h2>
<p>这里同时并发请求俩个接口 ,并且等待全部服务器响应完毕后才会触发回调</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">调用all()方法,在里面传入数组,在数组里写上想要发送的请求,然后then(results => )拿到最终请求 进行统一相关处理</span>
<span style="color: rgba(0, 0, 0, 1)">axios.all([
axios({
url:</span>'http://123.207.32.32:8000/home/multidata'<span style="color: rgba(0, 0, 0, 1)">,
timeout:</span>5<span style="color: rgba(0, 0, 0, 1)">,
}),
axios({
url:</span>'http://123.207.32.32:8000/home/data'<span style="color: rgba(0, 0, 0, 1)">,
timeout:</span>5<span style="color: rgba(0, 0, 0, 1)">,
params:{
type:</span>'sell'<span style="color: rgba(0, 0, 0, 1)">,
page:</span>5<span style="color: rgba(0, 0, 0, 1)">
}
})
]).then(axios.spread((res1,res2) </span>=><span style="color: rgba(0, 0, 0, 1)"> {
console.log(res1);
ocnsole.log(res2);
}))</span></pre>
</div>
<p> </p>
<p>扩展: 因为浏览器限制请求并发 只能6个请求</p>
<p>可以在同样的运行环境,同样的资源在多个域名(同一个ip)情况下加载,这个需要后端去配置,</p>
<p>在DNS服务商中申请多个域名,指向同一个 IP 服务,</p>
<p>对后台返回的数据进行域名处理,</p>
<p>对图片链接,进行域名替换,域名替换完成后,通过 localStorage 进行 key / value 保存。</p>
<p>以使得相同图片在下一次展示时,能使用浏览器缓存,而非重复加载。</p>
<p> </p>
<p>第一次拿到图片链接数组 传入下面的函数 ,吧图片域名地址替换成下面多个域名地址,(因为指向同一个IP所以都可以访问,并且加快响应速度50%以上)</p>
<div class="cnblogs_code">
<pre> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 替换域名</span>
<span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> replaceDomain(data) {
let imgUrlObj </span>= localStorage.getItem('imgUrlObj') || {} <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 获取本地保存的图片链接,能正常使用缓存</span>
<span style="color: rgba(0, 0, 255, 1)">if</span> (<span style="color: rgba(0, 0, 255, 1)">typeof</span>(imgUrlObj) === 'string') { <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 判断是否为JSON对象,不是则转换</span>
imgUrlObj =<span style="color: rgba(0, 0, 0, 1)"> JSON.parse(imgUrlObj)
}
let index </span>= Math.floor(Math.random() * 4.99) <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 随机0-4的下标</span>
<span style="color: rgba(0, 0, 255, 1)">try</span><span style="color: rgba(0, 0, 0, 1)"> {
data </span>=<span style="color: rgba(0, 0, 0, 1)"> JSON.stringify(data)
data </span>= data.replace(/www\.baidu\.com\/image(.*?)(jpg|png|jpeg)/g, (...params) => { <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 查找图片的url并对其进行操作</span>
let sourceUrl = params + params <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 图片资源名称,未包含域名。如:整条图片链接为:www.baidu.com/image/123.png; 现保存为:/image/123.png</span>
<span style="color: rgba(0, 0, 255, 1)">if</span> (!imgUrlObj) { <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 未保存在本地,则新产生域名</span>
let imgUrl = `node${}.baidu.com/image/${sourceUrl}` <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 域名替换,如:从 www.baidu.com 替换到 node1.baidu.com,node2.baidu.com</span>
imgUrlObj = imgUrl <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 同时保存好新的域名,在这就体现了使用JSON对象的好处,图片资源路径名当key值,图片完整链接当value值</span>
localStorage.setItem('imgUrlObj'<span style="color: rgba(0, 0, 0, 1)">, JSON.stringify(imgUrlObj))
index</span>++
<span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> imgUrl
} </span><span style="color: rgba(0, 0, 255, 1)">else</span> { <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 保存到了本地,则直接使用localStorage的url</span>
<span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> imgUrlObj
}
})
data </span>=<span style="color: rgba(0, 0, 0, 1)"> JSON.parse(data)
} </span><span style="color: rgba(0, 0, 255, 1)">catch</span><span style="color: rgba(0, 0, 0, 1)"> (e) {
console.log(</span>'replaceDomain error'<span style="color: rgba(0, 0, 0, 1)">)
console.log(e)
}
</span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> data
}</span></pre>
</div>
<p> </p>
<p>我是马丁的车夫,欢迎转发和收藏。</p>
<p> </p><br><br>
来源:https://www.cnblogs.com/Allen-project/p/15914097.html
頁:
[1]