Ts手动封装http请求

文章讲述了博主在Cocos游戏开发中遇到的HTTP请求问题,未发现官方API,通过JavaScript原生XMLHttpRequest实现并逐步封装,分享了封装过程和注意事项,包括异步请求、错误处理和数据解析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

博主在进行Cocos小游戏的开始时,想要实现http请求。简单的用node.js在本地搭了一个服务器后,查询Cocos的官方文档以及网上搜索,都没有发现官方封装的API。

博主之前从事原生微信小程序开发以及uniapp开发,使用惯了方便快捷的requestAPI,以为这个是很简单的一个东西。结果Cocos官方并没有封装过http请求!也是走了很多弯路,手动封装了一下http请求(每次都使用原生Js写法真的很让人抓狂),这里写出代码和具体思路,供诸位参考。

一、Js原生http请求的实现介绍

首先,Js原生http请求是使用XMLHttpRequest实现的。虽然这个东东以XML为前缀,但是其实也可以进行JSON格式数据的传输。

const xhr = new XMLHttpRequest();//创建XMLHttpRequest示例对象
xhr.setRequestHeader('Content-Type','application/json');//设置请求头,用来适配json格式数据传输
xhr.open('POST',url,true);//初始化请求,设置请求方式,请求地址,是否异步调用
xhr.send(JSON.stringfy(params));//发送请求参数(请求参数是跟在url后面的一串字符串,如?name=张三&age=18)

值得注意的是,参数其实是不支持中文字符的,但是为什么我们传入name=张三也是合法的呢?原因是绝大多数浏览器会自动将中文字符进行转码,弄成%开头的一堆数字。原本我们也是需要在脚本里面使用encodeURI这个函数进行转码的&#x

### 在 Vuex 中集成 API 请求的最佳实践 在 Vue.js 开发中,Vuex 是一种集中式的状态管理模式,而发起 HTTP 请求通常是应用与后端交互的重要部分。以下是关于如何在 Vuex 中集成 API 请求以及最佳实践的详细介绍。 #### 使用 Actions 处理异步逻辑 根据 Vue.js 的最佳实践,在 Vuex 中应该将 AJAX 请求放置于 `actions` 中[^1]。这是因为 `actions` 被设计用来处理异步操作,并可以触发多个 `mutations` 来更新状态。 ```javascript // store/actions.js export const fetchData = async ({ commit }) => { try { const response = await axios.get('https://api.example.com/data'); commit('SET_DATA', response.data); } catch (error) { console.error(error); } }; ``` 上述代码展示了如何定义一个名为 `fetchData` 的 action,该 action 通过 Axios 向指定 URL 发送 GET 请求,并将接收到的数据提交给 mutation 进行存储。 #### 配置 Vuex 和 Axios 插件 为了简化请求流程并增强功能,可以通过引入第三方工具如 `vuex-saga-ts` 或者自定义封装 Axios 实现更高效的管理方式。例如: - **Vuex-Saga-TS**: 如果需要更加复杂的业务流控制(比如 Sagas),可以在初始化 Vuex Store 时加载此插件[^2]。 ```typescript import Vue from 'vue'; import Vuex from 'vuex'; import VuexSagaPlugin from 'vuex-saga-ts'; Vue.use(Vuex); const sagaMiddleware = VuexSagaPlugin(); const store = new Vuex.Store({ state: {}, mutations: {}, actions: {}, plugins: [sagaMiddleware], }); export default store; ``` - **Vuex ORM Axios Plugin**: 此插件能够帮助开发者减少手动编写重复性的数据同步代码量[^3]。其核心在于利用拦截器机制自动完成请求前后的准备工作。 #### 封装 Axios 提高复用性 对于大多数项目而言,直接使用原生 Axios 并对其进行适当封装是一种常见做法[^4]。这样不仅可以统一设置基础路径、超时时间等参数,还能方便地加入全局错误处理器等功能。 ```javascript // utils/axiosInstance.js import axios from 'axios'; const instance = axios.create({ baseURL: process.env.VUE_APP_API_BASE_URL, timeout: 5000, // 设置默认超时时间为 5 秒钟 }); instance.interceptors.request.use(config => { config.headers['Authorization'] = localStorage.getItem('token'); // 添加 token 到 header 中 return config; }, error => Promise.reject(error)); instance.interceptors.response.use(response => response, error => { if (!error.response || !error.response.status === 401) { window.location.href = '/login'; // 当未授权访问资源时跳转至登录页 } return Promise.reject(error); }); export default instance; ``` 随后即可在整个应用程序范围内重用这个实例对象来进行各种类型的 HTTP 请求。 --- ### 总结 综上所述,推荐的方式是在 Vuex 的 `actions` 层面执行所有的网络请求任务;与此同时还可以借助一些优秀的社区贡献库进一步优化工作流程。无论是采用简单的 Axios 自定义配置还是高级别的中间件解决方案都取决于具体需求场景下的权衡考量。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

飞猪0_0

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值