为什么后端路由需要携带 /api 作为前缀?前端如何设置基础路径 /api?

news2025/3/25 16:40:38

一、为什么后端路由需要携带 /api 作为前缀?

1. 区分 API 端点与其他路由

在 Web 应用程序中,后端不仅需要处理 API 请求,还可能需要处理静态资源(如 HTML、CSS、JS 文件)或其他服务(如 WebSocket)。通过为 API 路由添加 /api 前缀,可以清晰地将其与其他请求区分开来,避免路由冲突。

例如:

  • API 请求:https://example.com/api/users
  • 静态资源请求:https://example.com/static/style.css

2. 方便路由管理

在大型项目中,API 路由通常由多个模块组成。为所有路由添加 /api 前缀,可以方便地对路由进行分类和管理。

例如:

  • 用户模块:/api/users
  • 订单模块:/api/orders
  • 商品模块:/api/products

3. 支持跨域请求

如果前端和后端分别部署在不同的域名或端口上,浏览器会执行跨域请求检查。通过为所有 API 路由添加 /api 前缀,可以更容易地配置跨域规则。

例如,后端可以配置 CORS 规则,只允许 /api 路径的请求:

<JAVA>

@Configuration
public class CorsConfig implements WebMvcConfigurer {

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/api/**") // 只允许 /api 路径的请求
                .allowedOrigins("*")
                .allowedMethods("GET", "POST", "PUT", "DELETE");
    }
}

4. 与前端路由区分

在单页应用(SPA)中,前端通常使用虚拟路由来管理页面导航。通过为所有后端路由添加 /api 前缀,可以避免与前端路由冲突。

例如:

  • 前端路由:https://example.com/dashboard
  • 后端路由:https://example.com/api/dashboard

5. 方便负载均衡和反向代理

在生产环境中,API 请求通常通过负载均衡器或反向代理(如 Nginx)进行路由。通过为所有 API 路由添加 /api 前缀,可以更容易地配置转发规则。

例如,Nginx 配置:

<NGINX>

location /api/ {
    proxy_pass http://backend-server/;
}

二、前端如何设置基础路径 /api

在前端项目中,所有对后端 API 的请求都需要携带 /api 前缀。以下是常见的实现方式:

1. 手动拼接路径

在发送请求时,手动为每个 API 添加 /api 前缀:

<JAVASCRIPT>

fetch('/api/users')
  .then(response => response.json())
  .then(data => console.log(data));

这种方式简单直接,但在大型项目中容易出错,且维护成本较高。

2. 使用环境变量

通过环境变量定义 API 的基础路径,并在请求中使用:

<JAVASCRIPT>

const API_BASE_URL = process.env.REACT_APP_API_BASE_URL || '/api';

fetch(`${API_BASE_URL}/users`)
  .then(response => response.json())
  .then(data => console.log(data));

.env 文件中定义:

REACT_APP_API_BASE_URL=/api

这种方式可以根据不同环境(如开发、测试、生产)动态修改 API 路径。

3. 使用 Axios 的全局配置

如果项目中使用 Axios 作为请求库,可以设置全局的 baseURL

<JAVASCRIPT>

import axios from 'axios';

axios.defaults.baseURL = '/api';

axios.get('/users')
  .then(response => console.log(response.data));

4. 使用前端路由代理

在开发环境中,可以通过前端路由代理将 /api 请求转发到后端服务器。例如,在 React 项目中,可以在 package.jsonvite.config.js 中配置代理:

<JSON>

{
  "proxy": "http://localhost:8080"
}

所有 /api 请求会被自动转发到后端服务器:

<JAVASCRIPT>

axios.get('/api/users') // 请求会被转发到 http://localhost:8080/api/users
  .then(response => response.json())
  .then(data => console.log(data));

三、总结

在 Web 应用程序中,为后端路由添加 /api 前缀是一种常见的做法,其主要原因包括:

  • 区分 API 端点与其他路由。
  • 方便路由管理和分类。
  • 支持跨域请求和反向代理。
  • 避免与前端路由冲突。

在前端项目中,可以通过以下方式设置基础路径 /api

  1. 手动拼接路径。
  2. 使用环境变量。
  3. 使用 Axios 的全局配置。
  4. 使用前端路由代理。

通过合理的配置,可以提高项目的可维护性和开发效率。如果你正在开发一个前后端分离的项目,不妨试试上述方法,相信它会为你的工作带来便利!🚀


参考资源

  • Axios 官方文档
  • Nginx 反向代理配置
  • React 开发环境代理配置

希望这篇博客对你有所帮助,欢迎在评论区分享你的经验和问题!😊

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2320649.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

RAG 架构地基工程-Retrieval 模块的系统设计分享

目录 一、知识注入的关键前奏——RAG 系统中的检索综述 &#xff08;一&#xff09;模块定位&#xff1a;连接语言模型与知识世界的桥梁 &#xff08;二&#xff09;核心任务&#xff1a;四大关键问题的协调解法 &#xff08;三&#xff09;系统特征&#xff1a;性能、精度…

(C语言)习题练习 sizeof 和 strlen

sizeof 上习题&#xff0c;不知道大家发现与上一张的习题在哪里不一样嘛&#xff1f; int main() {char arr[] "abcdef";printf("%zd\n", sizeof(arr));printf("%zd\n", sizeof(arr 0));printf("%zd\n", sizeof(*arr));printf(&…

Unity Animation的其中一种运用方式

Animation是Unity的旧的动画系统&#xff0c;先说目的&#xff0c;其使用是为了在UI中播放动效&#xff0c;并且在动效播放结束后接自定义事件而设计的 设计的关键点在于&#xff0c;这个脚本不是通过Animation直接播放动画片段&#xff0c;而是通过修改AnimationState的nor…

框架的CVE漏洞利用 php类 java类 手工操作和自动化操作蓝队分析漏洞利用的流量特征

前言 php重要框架和基本的识别特征 php的主要是 tp框架 和 laravel 当然还有 yii等 tp的主要特征 1\报错信息&#xff1a; 2、图标 3、请求头 Laravel特征 1、报错信息 2、请求头 php框架CVE利用 lavarvel 工具 https://github.com/zhzyker/CVE-2021-3129 https://git…

【算法day19】括号生成——数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。

括号生成 https://leetcode.cn/problems/generate-parentheses/description/ 数字 n 代表生成括号的对数&#xff0c;请你设计一个函数&#xff0c;用于能够生成所有可能的并且 有效的 括号组合。 左括号数必须大于右括号数&#xff0c;且小于等于n class Solution { publ…

Qt5.15.2实现Qt for WebAssembly与示例

目录 1.什么是Qt for WebAssembly&#xff1f; 1.1 什么是 WebAssembly&#xff1f; 1.2 WebAssembly 的优势 1.3 什么是 Qt for WebAssembly&#xff1f; 1.4 Qt for WebAssembly 的特点 1.5 编译过程 1.6 运行时环境 注意&#xff01;&#xff01;&#xff01;注意&am…

好吧好吧,看一下达梦的模式与用户的关系

单凭个人感觉&#xff0c;模式在达梦中属于逻辑对象合集&#xff0c;回头再看资料 应该是一个用户可以对应多个模式 问题来了&#xff0c;模式的ID和用户的ID一样吗&#xff1f; 不一样 SELECT USER_ID,USERNAME FROM DBA_USERS WHERE USERNAMETEST1; SELECT ID AS SCHID, NA…

HOW - DP 动态规划系列(三)(含01背包问题)

目录 一、01背包问题最直接的暴力解法动态规划解法 二、完全背包 通过几个算法的学习&#xff0c;理解和掌握动态规划来解决背包问题。 一、01背包问题 对于面试的话&#xff0c;掌握01背包和完全背包就够用了&#xff0c;最多可以再来一个多重背包。 如果这几种背包分不清&…

在linux服务器部署Heygem

前言&#xff1a; Heygem官方文档上提供了基于windwos系统的安装方案。在实际使用过程中个人电脑的配置可能不够。这个时候如果服务器配置够的话&#xff0c;可以尝试在服务器上装一下。但是服务器一般都是linux系统的&#xff0c;于是这篇教程就出现了… 可行性分析 通读安装…

图书管理系统系统-Java、SpringBoot、Vue和MySQL开发的图书馆管理系统

「springboot、vue图书馆管理系统.zip」 链接&#xff1a;https://pan.quark.cn/s/5a929a7e9450 分享一个图书管理系统&#xff0c;Java、SpringBoot、Vue和MySQL开发的图书馆管理系统 以下是对文本内容的总结&#xff1a; 项目概述 项目名称与背景&#xff1a; 项目概述 项…

[c语言日寄]数据输入

【作者主页】siy2333 【专栏介绍】⌈c语言日寄⌋&#xff1a;这是一个专注于C语言刷题的专栏&#xff0c;精选题目&#xff0c;搭配详细题解、拓展算法。从基础语法到复杂算法&#xff0c;题目涉及的知识点全面覆盖&#xff0c;助力你系统提升。无论你是初学者&#xff0c;还是…

字节DAPO算法:改进DeepSeek的GRPO算法-解锁大规模LLM强化学习的新篇章(代码实现)

DAPO算法&#xff1a;解锁大规模LLM强化学习的新篇章 近年来&#xff0c;大规模语言模型&#xff08;LLM&#xff09;在推理任务上的表现令人瞩目&#xff0c;尤其是在数学竞赛&#xff08;如AIME&#xff09;和编程任务中&#xff0c;强化学习&#xff08;RL&#xff09;成为…

计算机操作系统(四) 操作系统的结构与系统调用

计算机操作系统&#xff08;四&#xff09; 操作系统的结构与系统调用 前言一、操作系统的结构1.1 简单结构1.2 模块化结构1.3 分层化结构1.4 微内核结构1.5 外核结构 二、系统调用1.1 系统调用的基本概念1.2 系统调用的类型 总结&#xff08;核心概念速记&#xff09;&#xf…

DeepSeek技术架构解析:MoE混合专家模型

一、前言 2025年初&#xff0c;DeepSeek V3以557万美元的研发成本&#xff08;仅为GPT-4的1/14&#xff09;和开源模型第一的排名&#xff0c;在全球AI领域掀起波澜。其核心创新之一——混合专家模型&#xff08;Mixture of Experts, MoE&#xff09;的优化设计&#xff0c;不…

【正点原子】AI人工智能深度学习(RV1126/RK3568/RK3588)-第1期 准备篇

1.1SDK编译后的目录 1、真正的根文件系统镜像存放目录 2、非必须&#xff0c;负责系统升级等&#xff0c;kerneldtbramdisk组成的根文件系统 1.2文件系统分区 1.3开机自启动 1.6设置静态ip地址 1.8RKMedia框架/编译测试SDK自带RKMedia例程 出厂系统以下内容都是默认…

靶场(十五)---小白心得思路分析---LaVita

启程&#xff1a; 扫描端口&#xff0c;发现开放22&#xff0c;80端口&#xff0c;发现ws.css可能存在exp&#xff0c;经查发现无可利用的exp PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 8.4p1 Debian 5deb11u2 (protocol 2.0) | ssh-hostkey: | 3072 c9…

【AI大模型】DeepSeek + 通义万相高效制作AI视频实战详解

目录 一、前言 二、AI视频概述 2.1 什么是AI视频 2.2 AI视频核心特点 2.3 AI视频应用场景 三、通义万相介绍 3.1 通义万相概述 3.1.1 什么是通义万相 3.2 通义万相核心特点 3.3 通义万相技术特点 3.4 通义万相应用场景 四、DeepSeek 通义万相制作AI视频流程 4.1 D…

Pi型隶属函数(Π-shaped Membership Function)的详细介绍及python示例

我们前文已经深度解读了三角形、梯形、高斯、S型和Z型隶属函数&#xff0c;现在转向Pi型。当然我们先简要回顾不同隶属函数的特点和曲线效果。了解每种隶属函数的特性是为了更好的应用。 一、回顾五种隶属函数的特点 1.从每种隶属函数的结构和特点角度对比。三角形隶属函数&am…

MySQL 入门大全:常用函数

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/literature?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;…

SpringBoot3实战(SpringBoot3+Vue3基本增删改查、前后端通信交互、配置后端跨域请求、数据批量删除(超详细))(3)

目录 一、从0快速搭建SpringBoot3工程、SpringBoot3集成MyBatis、PageHelper分页查询的详细教程。(博客链接) 二、实现前端与后端通信对接数据。(axios工具) &#xff08;1&#xff09;安装axios。(vue工程目录) &#xff08;2&#xff09;封装请求工具类。(request.js) <1&…