昌小平 發表於 2025-10-15 09:38:00

uni-app x封装request,统一API接口请求

<h1>一、概述</h1>
<p>uni-app x&nbsp;提供了 uni.request() 方法。</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">uni.request({
url: </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">https://api.example.com</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">,
method: </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">GET</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">
})</span></pre>
</div>
<p>在实际项目开发中,直接使用 uni.request 会带来诸多问题,例如:</p>
<ul>
<li>重复代码多(如每次都要写 baseURL)</li>
<li>错误处理分散,难以统一管理</li>
<li>缺乏请求/响应拦截能力</li>
<li>Token 注入繁琐</li>
<li>Loading 状态管理混乱</li>
</ul>
<p><br>为了解决这些问题,封装一个统一的 HTTP 请求库是企业级开发的最佳实践。</p>
<h1>二、封装request</h1>
<p>uview-plus 自带一个 http 模块,但是在实际项目中,还是要自己封装一个,统一管理。</p>
<p>&nbsp;</p>
<p>在项目根目录创建utils目录,在里面创建request.ts。 <span style="color: rgba(255, 0, 0, 1)"><strong>注意:文件后缀必须是ts,而不是js</strong></span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> utils/request.ts</span>
import { http } from <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">uview-plus</span><span style="color: rgba(128, 0, 0, 1)">'</span>

<span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)"> 1. 全局配置 </span><span style="color: rgba(0, 128, 0, 1)">*/</span><span style="color: rgba(0, 0, 0, 1)">
http.setConfig((config) </span>=&gt;<span style="color: rgba(0, 0, 0, 1)"> {
    config.baseURL </span>= <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">https://api.example.com</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> api地址</span>
    config.timeout = <span style="color: rgba(128, 0, 128, 1)">8000</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 单位毫秒,对应8秒</span>
    config.loadingText = <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)">
    config.loading </span>= <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)"> 开启 loading 动画</span>
<span style="color: rgba(0, 0, 0, 1)">    return config
})

</span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)"> 2. 请求拦截 </span><span style="color: rgba(0, 128, 0, 1)">*/</span><span style="color: rgba(0, 0, 0, 1)">
http.interceptors.request.use((config) </span>=&gt;<span style="color: rgba(0, 0, 0, 1)"> {
    const token </span>= uni.getStorageSync(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">token</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)">if</span> (token) config.header.Authorization =<span style="color: rgba(0, 0, 0, 1)"> `Bearer ${token}`
    return config
})

</span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)"> 3. 响应拦截 </span><span style="color: rgba(0, 128, 0, 1)">*/</span><span style="color: rgba(0, 0, 0, 1)">
http.interceptors.response.use(
    (response) </span>=&gt;<span style="color: rgba(0, 0, 0, 1)"> response.data,
    (err) </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)"> 🔥 强制断言,让 UTS 闭嘴</span>
      (uni as any).$u.toast(err.message || <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)">)
      return Promise.reject(err)
    }
)

export default http</span></pre>
</div>
<p>&nbsp;</p>
<p>修改&nbsp;main.uts,引入&nbsp;request,并挂载为全局属性$http</p>
<div class="cnblogs_code">
<pre>import App from <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">./App.uvue</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">

import { createSSRApp } 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 uviewPlus from </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">uview-plus</span><span style="color: rgba(128, 0, 0, 1)">'</span>

<span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)"> 1. 引入 request(里面已经初始化好 http) </span><span style="color: rgba(0, 128, 0, 1)">*/</span><span style="color: rgba(0, 0, 0, 1)">
import http from </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">@/utils/request</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">

export </span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> createApp() {
    const app </span>=<span style="color: rgba(0, 0, 0, 1)"> createSSRApp(App)

    </span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)"> 2. 挂到全局属性 </span><span style="color: rgba(0, 128, 0, 1)">*/</span><span style="color: rgba(0, 0, 0, 1)">
    app.config.globalProperties.$http </span>=<span style="color: rgba(0, 0, 0, 1)"> http

    app.use(uviewPlus)
    return {
      app
    }
}</span></pre>
</div>
<h1>三、使用request</h1>
<p>由于在main.uts挂载了全局属性,因此在pages里面的uvue文件,就可以直接调用了。比如:</p>
<h2>get请求</h2>
<div class="cnblogs_code">
<pre>const res = await this.$http.get(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">/test</span><span style="color: rgba(128, 0, 0, 1)">'</span>, {})</pre>
</div>
<h2>post请求</h2>
<div class="cnblogs_code">
<pre>const res = await this.$http.post(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">/login</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">, {
    username: </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">admin</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">,
    password: </span><span style="color: rgba(128, 0, 128, 1)">123456</span><span style="color: rgba(0, 0, 0, 1)">
})</span></pre>
</div>
<h3>post请求,增加成功和失败处理</h3>
<div class="cnblogs_code">
<pre>async <span style="color: rgba(0, 0, 255, 1)">login</span><span style="color: rgba(0, 0, 0, 1)">() {
try {
    </span><span style="color: rgba(0, 128, 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, 0, 1)">
    const res </span>= await this.$http.post(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">/login</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">, {
      username: </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">admin</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">,
      password: </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">123456</span><span style="color: rgba(128, 0, 0, 1)">'</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>
    uni.setStorageSync(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">token</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">, res.token)
    this.$u.toast(</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)">)
    uni.switchTab({ url: </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">/pages/index/index</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)"> })
} catch (err: any) {
    </span><span style="color: rgba(0, 128, 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, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 拦截器已弹通用提示,这里可做“额外”处理</span>
    console.error(<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)">, err)
    </span><span style="color: rgba(0, 0, 255, 1)">if</span> (err.statusCode === <span style="color: rgba(128, 0, 128, 1)">401</span><span style="color: rgba(0, 0, 0, 1)">) {
      this.$u.toast(</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)">)
    }
}
}</span></pre>
</div>
<h3>post请求,局部请求不想显示 loading</h3>
<div class="cnblogs_code">
<pre>await this.$http.post(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">/log</span><span style="color: rgba(128, 0, 0, 1)">'</span>, data, { loading: <span style="color: rgba(0, 0, 255, 1)">false</span> })</pre>
</div>
<p>uview-plus 的 http 模块已经内置了 “请求开始自动显示 loading,响应结束自动隐藏” 的机制,<br>你只需要 把 loading 开关打开 即可,成功/失败/超时都会 统一自动关闭,无需手动处理。</p>
<p>效果:<br>调用 this.$http.get/post 瞬间 → 出现 uview-plus 的 loading 遮罩<br>请求 成功/失败/超时 → 遮罩 自动消失(由 uview 内部 finally 关闭)<br>无需自己 uni.showLoading() / uni.hideLoading()</p>
<p>&nbsp;</p>
<h3>post请求,增加header</h3>
<div class="cnblogs_code">
<pre>await this.$http.post(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">/upload</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">, body, {
header: {
    </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Content-Type</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)">application/x-wwwz-form-urlencoded</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">,
    </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">X-Custom</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)">abc123</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">
}
})</span></pre>
</div>
<h2>put请求</h2>
<div class="cnblogs_code">
<pre>const res = await this.$http.put(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">/test</span><span style="color: rgba(128, 0, 0, 1)">'</span>, {<span style="color: rgba(0, 0, 255, 1)">id</span>:<span style="color: rgba(128, 0, 128, 1)">1</span>})</pre>
</div>
<h2>delete请求</h2>
<div class="cnblogs_code">
<pre>const res = await this.$http.delete(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">/test</span><span style="color: rgba(128, 0, 0, 1)">'</span>, {<span style="color: rgba(0, 0, 255, 1)">id</span>:<span style="color: rgba(128, 0, 128, 1)">1</span>})</pre>
</div>
<h1>四、登录页面</h1>
<p>login.uvue</p>
<div class="cnblogs_code">
<pre>&lt;template&gt;
    &lt;view class=<span style="color: rgba(128, 0, 0, 1)">""</span>&gt;
      &lt;!-- 导航栏 --&gt;
      &lt;u-navbar title=<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> /&gt;

      &lt;!-- 内容区 --&gt;
      &lt;view class=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">content</span><span style="color: rgba(128, 0, 0, 1)">"</span>&gt;
            &lt;!-- 头像 --&gt;
            &lt;u-avatar :src=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">logo</span><span style="color: rgba(128, 0, 0, 1)">"</span> size=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">80</span><span style="color: rgba(128, 0, 0, 1)">"</span>&gt;&lt;/u-avatar&gt;

            &lt;!-- 表单 --&gt;
            &lt;u--form :model=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">form</span><span style="color: rgba(128, 0, 0, 1)">"</span> labelPosition=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">left</span><span style="color: rgba(128, 0, 0, 1)">"</span>&gt;
                &lt;u--input v-model=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">form.username</span><span style="color: rgba(128, 0, 0, 1)">"</span> placeholder=<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> prefixIcon=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">account</span><span style="color: rgba(128, 0, 0, 1)">"</span> /&gt;
                &lt;u--input v-model=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">form.password</span><span style="color: rgba(128, 0, 0, 1)">"</span> placeholder=<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> type=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">password</span><span style="color: rgba(128, 0, 0, 1)">"</span> prefixIcon=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">lock</span><span style="color: rgba(128, 0, 0, 1)">"</span> /&gt;
            &lt;/u--form&gt;

            &lt;!-- 按钮 --&gt;
            &lt;u-button text=<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> type=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">primary</span><span style="color: rgba(128, 0, 0, 1)">"</span> @click=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">login</span><span style="color: rgba(128, 0, 0, 1)">"</span> /&gt;

            &lt;!-- 链接 --&gt;
            &lt;view class=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">links</span><span style="color: rgba(128, 0, 0, 1)">"</span>&gt;
                &lt;u-cell title=<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> isLink @click=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">gotoForget</span><span style="color: rgba(128, 0, 0, 1)">"</span> /&gt;
                &lt;u-cell title=<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> isLink @click=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">gotoRegister</span><span style="color: rgba(128, 0, 0, 1)">"</span> /&gt;
            &lt;/view&gt;
      &lt;/view&gt;
    &lt;/view&gt;
&lt;/template&gt;

&lt;script&gt;<span style="color: rgba(0, 0, 0, 1)">
    export default {
      data() {
            return {
                title: </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Hello</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">,
                logo: </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">/static/logo.png</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">,
                form: {
                  username: </span><span style="color: rgba(128, 0, 0, 1)">''</span><span style="color: rgba(0, 0, 0, 1)">,
                  password: </span><span style="color: rgba(128, 0, 0, 1)">''</span><span style="color: rgba(0, 0, 0, 1)">,
                }
            }
      },
      onLoad() {

      },
      methods: {
            async </span><span style="color: rgba(0, 0, 255, 1)">login</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)">this.form.username) {
                  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>, icon: <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)"> })
                  return
                }
                </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)">                try {
                  </span><span style="color: rgba(0, 128, 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, 0, 1)">
                  const res </span>= await this.$http.post(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">/login</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">, {
                        username: this.form.username,
                        password: this.form.password
                  })

                  </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 这里只写“成功后的业务”</span>
                  uni.setStorageSync(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">token</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">, res.token)
                  this.$u.toast(</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)">)
                  uni.switchTab({ url: </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">/pages/index/index</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)"> })
                } catch (err : any) {
                  </span><span style="color: rgba(0, 128, 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, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 拦截器已弹通用提示,这里可做“额外”处理</span>
                  console.error(<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)">, err)

                  </span><span style="color: rgba(0, 0, 255, 1)">if</span> (err.statusCode === <span style="color: rgba(128, 0, 128, 1)">401</span><span style="color: rgba(0, 0, 0, 1)">) {
                        this.$u.toast(</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)">)
                  }
                  this.$u.toast(</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)">)
                }
            },
            gotoForget() {
                uni.navigateTo({ url: </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">/pages/forget/index</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)"> })
            },
            gotoRegister() {
                uni.navigateTo({ url: </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">/pages/register/index</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)"> })
            }

      }
    }
</span>&lt;/script&gt;

&lt;style scoped&gt;<span style="color: rgba(0, 0, 0, 1)">
    .content {
      padding: 40rpx;
      display: flex;
      flex</span>-<span style="color: rgba(0, 0, 0, 1)">direction: column;
      align</span>-<span style="color: rgba(0, 0, 0, 1)">items: center;
    }

    .links {
      margin</span>-<span style="color: rgba(0, 0, 0, 1)">top: 30rpx;
      width: </span><span style="color: rgba(128, 0, 128, 1)">100</span>%<span style="color: rgba(0, 0, 0, 1)">;
    }
</span>&lt;/style&gt;</pre>
</div>
<p>效果如下:</p>
<p><img src="https://img2024.cnblogs.com/blog/1341090/202510/1341090-20251014182136267-490899665.png" alt="image" loading="lazy"></p>
<p>&nbsp;</p>
<p>针对大型项目,可以在utils里面新建一个api.ts,用来编写一些公用业务函数,例如:</p>
<div class="cnblogs_code">
<pre>import http from <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">./request.js</span><span style="color: rgba(128, 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, 128, 0, 1)">*/</span><span style="color: rgba(0, 0, 0, 1)">
export const </span><span style="color: rgba(0, 0, 255, 1)">login</span> = (username, <span style="color: rgba(0, 0, 255, 1)">pwd</span>) =&gt;<span style="color: rgba(0, 0, 0, 1)">
http.post(</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">/login</span><span style="color: rgba(128, 0, 0, 1)">'</span>, { username, <span style="color: rgba(0, 0, 255, 1)">pwd</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, 128, 0, 1)">*/</span><span style="color: rgba(0, 0, 0, 1)">
export const getBanner </span>= () =&gt;<span style="color: rgba(0, 0, 0, 1)">
http.get(</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">/banner</span><span style="color: rgba(128, 0, 0, 1)">'</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, 128, 0, 1)">*/</span><span style="color: rgba(0, 0, 0, 1)">
export const getGoods </span>= (params) =&gt;<span style="color: rgba(0, 0, 0, 1)">
http.get(</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">/goods</span><span style="color: rgba(128, 0, 0, 1)">'</span>, { params })</pre>
</div>
<p>&nbsp;然后在pages里面的页面,就可以调用了,无需重复写函数。</p>
<div class="cnblogs_code">
<pre>&lt;script&gt;<span style="color: rgba(0, 0, 0, 1)">
    import { getBanner } from </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">@/utils/api.ts</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">
    export default {
      data() {
            return {
                title: </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Hello</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">,
                bannerList: [],
            }
      },
      onLoad() {
            this.getbannerList()
      },
      methods: {
            async getbannerList() {
                </span><span style="color: rgba(0, 128, 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, 0, 1)">
                this.bannerList </span>=<span style="color: rgba(0, 0, 0, 1)"> await getBanner()
            },
      }
    }
</span>&lt;/script&gt;</pre>
</div>
<p>注意:直接调用,要用异步,函数名前面加async</p>
<p>&nbsp;</p><br><br>
来源:https://www.cnblogs.com/xiao987334176/p/19141750
頁: [1]
查看完整版本: uni-app x封装request,统一API接口请求