胜合冷冻食品商行 發表於 2019-8-18 17:33:00

uniapp 动态获取接口域名

<h1>背景</h1>
<p>接口域名没有写死,而是动态获取。具体实现就是 通过读取一个静态json文件,来设置真实的接口域名。因为公司之前所有的项目都是这么处理的,好处是 原域名有可能被封,这样可以直接后台操作修改该配置文件即可;不然的话,h5 项目可能还好说,app 的话必须重新发版。</p>
<h1>代码</h1>
<p>// httpService.js 对 uni.request 的封装。</p>
<p><span style="text-decoration: underline"><strong>在数据请求入口处,统一先进行 域名获取,即 执行 config.requestRemoteIp 方法</strong></span></p>
<div class="cnblogs_code">
<pre>import config <span style="color: rgba(0, 0, 255, 1)">from</span> <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">@/config</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">
import Vue </span><span style="color: rgba(0, 0, 255, 1)">from</span> <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">vue</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">
import cacheData </span><span style="color: rgba(0, 0, 255, 1)">from</span> <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">@/service/cacheData.js</span><span style="color: rgba(128, 0, 0, 1)">'</span>
<span style="color: rgba(0, 0, 255, 1)">const</span> MockUtil = () =&gt; import(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">@/libs/mockUtil.js</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
import Storage </span><span style="color: rgba(0, 0, 255, 1)">from</span> <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">@/libs/storage.js</span><span style="color: rgba(128, 0, 0, 1)">'</span>

<span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> HttpRequest {

    </span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">*
   * 读取接口数据
   * @param options 请求信息
   * @param noMock在整体使用mock数据的情形下,可 单独设置 某个接口请求真实数据
   * @param cacheId
   * @returns {*}
   </span><span style="color: rgba(0, 128, 0, 1)">*/</span>
    <span style="color: rgba(0, 0, 255, 1)">async</span> requestResolve(options, urlCustom = <span style="color: rgba(128, 0, 0, 1)">''</span>, noMock = <span style="color: rgba(0, 0, 255, 1)">false</span>, cacheId = <span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">) {
      let remoteIP </span>= <span style="color: rgba(0, 0, 255, 1)">await</span> config.requestRemoteIp(); <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 === <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">development</span><span style="color: rgba(128, 0, 0, 1)">'</span> &amp;&amp; config.isMockApi &amp;&amp; !<span style="color: rgba(0, 0, 0, 1)">noMock) {
            </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.getMockData(options)
      }
      </span><span style="color: rgba(0, 0, 255, 1)">if</span> (cacheId &amp;&amp;<span style="color: rgba(0, 0, 0, 1)"> cacheData) {
            </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.testHttp(cacheData)
      }
      </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">new</span> Promise((resolve, reject) =&gt;<span style="color: rgba(0, 0, 0, 1)"> {
            let baseUrl </span>= process.env.NODE_ENV === <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">development</span><span style="color: rgba(128, 0, 0, 1)">'</span> ?<span style="color: rgba(0, 0, 0, 1)"> config.baseUrl.dev : config.baseUrl.pro;
            options.url </span>= baseUrl + options.url +<span style="color: rgba(0, 0, 0, 1)"> `${urlCustom}`;
            uni.request(
                Object.assign({
                  success: (res) </span>=&gt;<span style="color: rgba(0, 0, 0, 1)"> {
                        </span><span style="color: rgba(0, 0, 255, 1)">if</span> (res.statusCode != <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">200</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">){
                            uni.showToast({
                              title: </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">服务器错误:</span><span style="color: rgba(128, 0, 0, 1)">'</span>+<span style="color: rgba(0, 0, 0, 1)">res.statusCode,
                              icon: </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">none</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
                            })
                            reject()
                        }
                        </span><span style="color: rgba(0, 0, 255, 1)">else</span> <span style="color: rgba(0, 0, 255, 1)">if</span> (res.data.code == <span style="color: rgba(128, 0, 128, 1)">10001</span><span style="color: rgba(0, 0, 0, 1)">) {
                            Storage.removeToken();
                            let vue </span>= <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> Vue();
                            vue.$store.dispatch(</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">logout</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
                            vue.$routeUtil.reLaunch(</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">main</span><span style="color: rgba(128, 0, 0, 1)">'</span><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> (res.data.code != <span style="color: rgba(128, 0, 128, 1)">200</span><span style="color: rgba(0, 0, 0, 1)">) {
                            </span><span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)"> (res.data.message) {
                              uni.showToast({
                                    icon: </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">none</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">,
                                    title: res.data.message
                              });
                            }
                            reject(res.data)
                        } </span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)"> {
                            </span><span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)"> (cacheId) {
                              cacheData </span>=<span style="color: rgba(0, 0, 0, 1)"> res.data.data
                            }
                            resolve(res.data.data)
                        }
                  },
                  fail: err </span>=&gt;<span style="color: rgba(0, 0, 0, 1)"> {
                        uni.showToast({
                            title: </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">服务器错误</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">,
                            icon: </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">none</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
                        })
                  }
                }, options)
            );
      })
    }

    </span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">*
   * mock数据按需导入
   * @param options
   * @returns {*}
   </span><span style="color: rgba(0, 128, 0, 1)">*/</span>
    <span style="color: rgba(0, 0, 255, 1)">async</span><span style="color: rgba(0, 0, 0, 1)"> getMockData(options) {
      </span><span style="color: rgba(0, 0, 255, 1)">const</span> Mock = <span style="color: rgba(0, 0, 255, 1)">await</span><span style="color: rgba(0, 0, 0, 1)"> MockUtil()
      </span><span style="color: rgba(0, 0, 255, 1)">const</span> MockUrl = Mock.<span style="color: rgba(0, 0, 255, 1)">default</span><span style="color: rgba(0, 0, 0, 1)">
      </span><span style="color: rgba(0, 0, 255, 1)">if</span> (<span style="color: rgba(0, 0, 255, 1)">typeof</span> MockUrl !== <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">function</span><span style="color: rgba(128, 0, 0, 1)">'</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, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.testHttp(MockUrl)
      }
      </span><span style="color: rgba(0, 0, 255, 1)">if</span> (options.method === <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">post</span><span style="color: rgba(128, 0, 0, 1)">'</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, 255, 1)">this</span>.testHttp(MockUrl(options.data, <span style="color: rgba(0, 0, 255, 1)">false</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, 255, 1)">this</span>.testHttp(MockUrl(options.<span style="color: rgba(0, 0, 255, 1)">params</span>, <span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">))
    }
    testHttp(data) {
      let pro </span>= <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> Promise(function(resolve, reject) {
            setTimeout(function() {
                resolve(data)
            }, </span><span style="color: rgba(128, 0, 128, 1)">50</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)"> pro
    }
}
export </span><span style="color: rgba(0, 0, 255, 1)">default</span> <span style="color: rgba(0, 0, 255, 1)">new</span> HttpRequest()</pre>
</div>
<p>// config.js</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">const</span> config =<span style="color: rgba(0, 0, 0, 1)"> {
isMockApi: </span><span style="color: rgba(0, 0, 255, 1)">false</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)"> requestUrl: '</span><span style="color: rgba(0, 128, 0, 1); text-decoration: underline">http://qiniu.eightyin.cn/teacherpath.json?time=</span><span style="color: rgba(0, 128, 0, 1)">' + Math.random().toString(36),</span>
requestUrl: <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">http://qiniu.eightyin.cn/teacherpathtest.json?time=</span><span style="color: rgba(128, 0, 0, 1)">'</span> + Math.random().toString(<span style="color: rgba(128, 0, 128, 1)">36</span><span style="color: rgba(0, 0, 0, 1)">),
baseUrl: {
   
    dev: </span><span style="color: rgba(128, 0, 0, 1)">''</span><span style="color: rgba(0, 0, 0, 1)">,
    pro: </span><span style="color: rgba(128, 0, 0, 1)">''</span><span style="color: rgba(0, 0, 0, 1)">
},
img: {
    ossDomain: </span><span style="color: rgba(128, 0, 0, 1)">''</span><span style="color: rgba(0, 0, 0, 1)">
},
uuid: Math.random().toString(</span><span style="color: rgba(128, 0, 128, 1)">36</span>).substring(<span style="color: rgba(128, 0, 128, 1)">3</span>, <span style="color: rgba(128, 0, 128, 1)">20</span><span style="color: rgba(0, 0, 0, 1)">),
requestRemoteIp: () </span>=&gt;<span style="color: rgba(0, 0, 0, 1)"> {
      console.log(</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">config:</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">, config)
      </span><span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)"> (config.RemoteIpInited)
      </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> Promise.resolve();
      </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">new</span> Promise((resolve, reject) =&gt;<span style="color: rgba(0, 0, 0, 1)"> {
            uni.request({
                url: config.requestUrl,
                success: (response) </span>=&gt;<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)">todo 测试
                  </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> config.baseUrl.pro = response.data.data.path;</span>
                  config.baseUrl.dev = <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">http://bayin5.mycwgs.com/</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">;
                  config.img.ossDomain </span>=<span style="color: rgba(0, 0, 0, 1)"> response.data.data.ossDomain;
                  config.RemoteIpInited </span>= <span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">;
                  resolve()
                },
                fail: () </span>=&gt;<span style="color: rgba(0, 0, 0, 1)"> {
                  config.RemoteIpInited </span>= <span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">;
                  resolve()
                }
            })
      });
}
}

export </span><span style="color: rgba(0, 0, 255, 1)">default</span> config</pre>
</div>
<p>&nbsp;</p><br><br>
来源:https://www.cnblogs.com/fan-zha/p/11373118.html
頁: [1]
查看完整版本: uniapp 动态获取接口域名