vue中如何封装fetch请求

1.创建streamRequest.js文件,放入下方代码

// 创建 fetch 实例
const service = {
  baseURL: process.env.VUE_APP_BASE_API, 
  timeout: 300000,
  responseType: 'text', // 修改为text类型
}

// 请求拦截器
const requestInterceptor = (config) => {
  // 确保 config.headers 存在
  config.headers = config.headers || {};
  config.headers['Content-Type'] = 'application/json';
  return config;
}

// 发送请求
service.request = async (config) => {
  config = requestInterceptor(config);
  const url = `${service.baseURL}${config.url}`;
  const response = await fetch(url, {
    method: config.method || 'GET',
    headers: config.headers,
    body: config.data ? JSON.stringify(config.data) : undefined,
  });

  if (!response.body) {
    throw new Error('Response body is null');
  }

  // 读取数据流
  const reader = response.body.getReader();
  // 文本解码器
  const decoder = new TextDecoder();
  let buffer = '';

  return {
    data: {
      async *[Symbol.asyncIterator]() {
        while (true) {
          const { done, value } = await reader.read();
          if (done) break;

          buffer += decoder.decode(value, { stream: true });
          const lines = buffer.split('\n');
          buffer = lines.pop() || '';

          for (const line of lines) {
            if (line.trim()) {
              try {
                const data = JSON.parse(line);
                yield data;
              } catch (e) {
                console.error('解析流数据失败:', e);
              }
            }
          }
        }
      }
    }
  };
}

export default service;

2.引入对应的api文件中,并进行使用

import streamRequest from '@/utils/streamRequest'

// 流式对话
export function streamDialogue(data) {
  return streamRequest.request({
    url: '', //替换为自己的api接口
    method: 'post',
    data: data
  })
}
### 封装 Axios 请求Vue3 项目中,为了简化 HTTP 请求并提高代码的可维护性和重用性,通常会对 `axios` 进行封装。通过这种方式可以在一处集中管理请求配置、错误处理逻辑以及可能的身份验证令牌等。 #### 安装 Axios 库 首先需要确保已经安装了 `axios`: ```bash npm install axios --save ``` #### 创建 Request 实例 接着在一个新的 JavaScript 文件(比如命名为 `request.js` 或者按照个人习惯命名),来创建一个自定义的 `axios` 实例,并为其设定全局性的选项,如基础 URL 和超时时间等[^2]。 ```javascript // src/utils/request.js import axios from 'axios'; const service = axios.create({ baseURL: process.env.VUE_APP_BASE_API, // API 基础路径可以从环境变量获取 timeout: 5000 // 设置请求超时时长为五秒 }); ``` #### 添加拦截器 为了让应用程序更加健壮,还可以添加请求和响应拦截器来进行预处理或后处理工作。例如,在所有的 GET 请求之前自动附加身份认证信息,或者统一捕获所有失败的响应以执行特定的操作[^3]。 ```javascript // 继续编辑 src/utils/request.js 文件... service.interceptors.request.use( config => { const token = localStorage.getItem('token'); if (token) { config.headers['Authorization'] = `Bearer ${token}`; } return config; }, error => Promise.reject(error) ); service.interceptors.response.use( response => response.data, error => { console.error(`Error occurred during request:`, error); return Promise.reject(error); } ); ``` #### 导出常用的方法 最后一步就是把常用的 HTTP 方法打包成易于使用的函数形式导出去供其他地方调用。这不仅限于简单的 get/post 调用,也可以包括任何业务场景下的复杂查询构建等功能。 ```javascript // 继续编辑 src/utils/request.js 文件... export function fetch(url, params) { return service.get(url, {params}) } export function create(data, url) { return service.post(url, data) } ``` 以上就是在 Vue3 中对 `axios` 的基本封装方式,它使得发起网络请求变得更加直观简单的同时也增强了项目的灵活性与扩展能力[^4]。 #### 使用封装后的 Axios 发起请求 一旦完成了上述步骤之后就可以轻松地在整个应用里边使用这个被封装过的 `axios` 来做各种类型的 http 请求而不需要重复书写相同的代码片段了。 ```typescript // 在某个组件内 import { ref } from 'vue'; import { onMounted } from 'vue'; import { fetch, create } from '@/utils/request'; export default { setup() { let items = ref([]); async function loadItems() { try { const result = await fetch('/items'); items.value = result.items; } catch(e){ alert("Failed to retrieve items"); } } onMounted(() => { loadItems(); }); return { items }; } }; ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值