React项目中请求接口的封装

本文介绍了在React项目中如何封装API接口,包括ApiIp.js用于根据环境动态配置请求地址,ApiURL.js用于构建完整的请求URL,以及Api.js作为对外请求的入口,利用axios进行Promise封装,便于错误处理和组件使用。同时,文中还展示了如何处理POST请求以下载文件的特殊案例。

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

封装目录中所包含的文件

  • Api.js
  • ApiIp.js
  • ApiURL.js
    在这里插入图片描述

ApiIp.js文件的作用

这个文件的作用主要是在开发环境和生产环境下调用不同的接口请求地址,生产环境下此文件的作用是动态
的获取浏览器中的地址进行拼装,便可以动态的获取地址,不需要写死

//获取当前的URL中的地址,同时携带端口号,不携带http://
let projectAddrass = window.location.host;
let projectAddrassNoPort = window.location.hostname;
//返回当前的URL协议,既http协议还是https协议
let protocol = document.location.protocol;
//封装请求接口的地址,如果服务器中套了一层性项目名称,需要在这里面添加上,需要留意,例如: /zzxl/
export const interfaceIp = `${
   
   protocol}//${projectAddrass}/zzxl`;
//LOGO图片的请求地址
export const logoImgAddress = `${
   
   protocol}//${projectAddrassNoPort}`;
//对外提供的服务地址
export const publicIp = process.env.NODE_ENV === 'development' ? 'http://10.222.40.243:8088' :
interfaceIp;
export const logoImgIp = process.env.NODE_ENV === 'development' ? 'http://127.0.0.1' :
logoImgAddress;

ApiURL.js文件的作用

引入ApiIp.js传入的地址,并且封装上具体的请求路径,拼装成完整的请求地址,这样可以把所有的接口请求
地址放到一个文件中,降低耦合度,便于维护。

import ApiIP from './ApiIp';
// 登录
export const LOGIN = `${
   
   ApiIP}/index/captcha`;

Api.js文件的作用

对外请求接口服务的入口文件,借助于axios 的再次封装,返回为Promise 对象,因为Promise对象含有
then、catch方法 便于进一步的处理。

import axios from 'axios';
import * as apiUrl from './ApiURL';
import {
   
   notification} from 'antd';

const key = 'keepOnlyOne';

/**
 *  接口请求数据时执行的方法
 *  接受参数为请求的路径apiUrl、请求接口配置参数configObj
 *
 * @param {String} apiUrl            用户传入的请求路径
 * @param {Object} configObj        用户传入的接口参数
 */
function getDataFromServer(apiUrl, configObj) {
   
   

    //用户传入的接口配置参数
    let {
   
   
        method = 'GET',
        params = {
   
   },
        data = {
   
   },
        timeout = 5000
    } = configObj
### 封装 Axios 实现 HTTP 请求 为了提高代码的可读性和复用性,在 React 项目中可以创建一个专门用于处理 HTTP 请求的服务文件。通过这种方式,可以在整个应用程序中轻松调用这些服务而无需重复编写相同的逻辑。 #### 创建 `http.js` 文件定义基础配置 首先建立一个名为 `http.js` 的文件来设置全局默认选项以及拦截器等功能: ```javascript import axios from 'axios'; // 设置默认的基础URL和其他公共配置项 const instance = axios.create({ baseURL: process.env.REACT_APP_API_URL || "https://default-base-url.com", timeout: 5000, }); // 添加请求拦截器 instance.interceptors.request.use( config => { // 可在此处添加token认证等操作 const token = localStorage.getItem('authToken'); if (token) { config.headers.Authorization = `Bearer ${token}`; } return config; }, error => Promise.reject(error), ); // 添加响应拦截器 instance.interceptors.response.use( response => response.data, // 自动解包数据层 error => { // 处理错误情况下的统一提示或其他业务逻辑 console.error(`Request failed with status code ${error?.response?.status}`); throw error; }, ); export default instance; ``` #### 定义具体 API 方法 接着在同一目录下新建 `api.js` 或者其他名称合适的服务模块文件,用来声明具体的接口函数: ```javascript import http from './http'; class ApiService { static async fetchHighScores() { try { let result = await http.get('/home/highscore'); return result; } catch (err) { console.error(err.message); throw err; } } /* 更多API方法 */ } export default ApiService; ``` 上述实现方式不仅让每次发起网络请求变得更加简单直观,同时也便于维护和扩展新的功能特性[^1]。 当需要在一个组件内部使用时,则只需引入此服务类即可快速完成相应操作: ```jsx import React, { useEffect } from 'react'; import ApiService from '@/services/api'; function PageOne() { useEffect(() => { async function fetchData(){ try{ const data = await ApiService.fetchHighScores(); console.log(data); }catch(e){ console.warn("Failed to load high scores", e); } }; fetchData(); }, []); return ( <div>PageOne</div> ); } export default PageOne; ``` 这种模式遵循了单一职责原则,并且使得测试变得容易得多,因为现在所有的HTTP交互都被集中管理起来了[^2]。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值