Axios与Java Spring交互:RESTful API设计与实现全解析

一、Axios、Spring框架

Axios 在前后端分离架构中扮演着重要角色,它是基于Promise的HTTP库,常用于浏览器和node.js环境中。Axios的重要性体现在:

  • 异步数据交互:前端使用Axios可以方便地发起Ajax请求,与后端RESTful API进行数据交换。
  • 跨域请求支持:Axios原生支持CORS,简化了处理跨域请求的复杂性。
  • 请求/响应拦截器:允许开发者在请求发出前或响应到达后添加额外的处理逻辑,如统一处理错误、添加认证信息等。
  • 用户友好:提供了简洁的API和丰富的配置选项,易于上手且功能强大。

Spring框架,尤其是Spring Boot,对于后端开发至关重要,特别是在实现前后端分离的架构时:

  • 简化配置:Spring Boot通过约定优于配置的原则,极大减少了传统Spring应用的配置工作量。
  • 内置RESTful支持:轻松创建RESTful风格的API,与前端交互,提供数据服务。
  • 集成便利:提供了大量的Starter POMs,可以快速集成数据库访问、安全、消息队列等多种功能。
  • 微服务友好:与Spring Cloud等框架配合,支持构建云原生的微服务架构,适合大规模应用开发。

二、HTTP方法其意义

理解HTTP方法的基本含义,这些方法遵循了RESTful架构的设计原则,分别对应着数据的检索(GET)、创建(POST)、更新(PUT/PATCH)和删除(DELETE)操作,是构建Web服务和API时的基础。

  • GET: 读取资源,参数通过URL传递,适合获取数据,是幂等的,安全但不适合敏感信息,可缓存。
  • POST: 提交数据,数据在正文,常用于创建新资源或处理数据,非幂等。
  • PUT: 更新资源,替换已有资源的全部数据,需知资源URL,数据在正文,幂等。
  • DELETE: 删除资源,根据URL移除指定资源,无正文,幂等。

三、Axios与Java Spring交互基础

Axios 安装

如果你是在一个基于 Node.js 的前端项目中使用 Axios,可以通过 npm 或 yarn 来安装它:

使用 npm:

npm install axios

使用 yarn:

yarn add axios

Axios 配置与使用

在前端项目中,你可以在需要发送 HTTP 请求的地方导入 Axios,并直接使用它来发送请求。以下是一个简单的示例:

import axios from 'axios';axios.get('http://localhost:8080/api/data').then(response => {console.log(response.data);}).catch(error => {console.error("Error fetching data", error);});

Spring Boot 项目快速启动

  1. 环境准备:确保你已经安装了 JDK 8 或更高版本以及 Maven 或 Gradle。

  2. 创建项目:你可以使用 Spring Initializr (https://start.spring.io/) 来快速生成一个基础的 Spring Boot 项目。选择你所需的依赖,如 Web(这会自动包含 Spring MVC 和 Tomcat 服务器)和其他可能需要的依赖。

  3. 编写 RESTful API:在生成的项目中,创建一个新的 Java 类,并使用 @RestController 注解标记该类,然后定义处理方法,如:

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class DataController {@GetMapping("/api/data")public String getData() {return "Hello from Spring Boot!";}
}
  1. 运行项目:在项目根目录下,使用命令行工具执行 mvn spring-boot:run(如果你是用Maven管理项目)或 gradlew bootRun(如果是Gradle)。这将启动一个嵌入式的 Tomcat 服务器,并运行你的应用。

  2. 测试交互:现在你的 Spring Boot 应用已经运行,并提供了一个简单的 API。你可以使用之前配置好的 Axios 发送请求来测试这个 API。

四、接口请求与接收实战

第一种:/delete/{id} (删除单个资源)

前端传参:get、restful;后端接参:@GetMapping、@PathVariable

前端(Axios):

axios.delete(`/delete/${id}`).then(response => {console.log('Resource deleted successfully', response.data);}).catch(error => {console.error('Error deleting resource', error);});

原因:使用delete方法直接对应于HTTP的DELETE操作,用于删除指定资源。这里利用了Restful风格中的路径参数,直接将资源ID嵌入URL中,清晰明了。

后端(Java Spring):

@GetMapping("/delete/{id}")
public ResponseEntity<String> deleteResource(@PathVariable("id") Long id) {// 实现删除逻辑service.deleteById(id);return ResponseEntity.ok("Resource with ID " + id + " has been deleted.");
}

原因@GetMapping搭配@PathVariable注解可以方便地从URL路径中提取参数,适合处理Restful风格的路径参数。

第二种:/delete?id=11(通过查询参数删除)

前端传参:get、params;后端接参:@GetMapping、@RequestParam

前端(Axios):

axios.get('/delete', { params: { id: 11 } }).then(response => {console.log('Resource deleted successfully', response.data);}).catch(error => {console.error('Error deleting resource', error);});

原因:虽然这里是执行删除操作,但使用GET方法传递查询参数,适用于不直接修改服务器状态的查询操作。实际应用中应避免使用GET进行删除操作,因为这不符合REST原则且可能不安全。

后端(Java Spring):

@GetMapping("/delete")
public ResponseEntity<String> deleteResourceById(@RequestParam("id") Long id) {// 实现删除逻辑service.deleteById(id);return ResponseEntity.ok("Resource with ID " + id + " has been deleted.");
}

原因@RequestParam用于从请求的查询字符串中获取参数值,适合处理非路径参数的请求。

第三种:{id:1} (POST请求,传递JSON对象)

前端传参:post、data;后端接参:@PostMapping、@RequestBody

前端(Axios):

axios.post('/update', { id: 1 }).then(response => {console.log('Resource updated successfully', response.data);}).catch(error => {console.error('Error updating resource', error);});

原因:使用POST请求通常表示创建或更新资源,这里携带JSON对象作为请求体,符合RESTful设计中对资源操作的规范。

后端(Java Spring):

@PostMapping("/update")
public ResponseEntity<String> updateResource(@RequestBody ResourceUpdateRequest request) {Long id = request.getId();// 实现更新逻辑service.updateResource(id);return ResponseEntity.ok("Resource with ID " + id + " has been updated.");
}

原因@PostMapping配合@RequestBody可以接收请求体中的JSON数据并自动转换为Java对象,非常适合处理包含复杂数据结构的请求。

第四种:/update (PUT请求,更新资源)

前端传参:put、data;后端接参:@PutMapping、@RequestBody
前端(Axios):

axios.put('/update', { id: 1, newName: 'New Name' }).then(response => {console.log('Resource updated successfully', response.data);}).catch(error => {console.error('Error updating resource', error);});

原因:PUT请求常用于完全替换一个资源,这里携带资源的全部或部分属性作为请求体,符合HTTP协议中对PUT方法的语义。

后端(Java Spring):

@PutMapping("/update")
public ResponseEntity<String> updateResourceCompletely(@RequestBody ResourceUpdateRequest request) {Long id = request.getId();String newName = request.getNewName();// 实现更新逻辑service.updateResourceCompletely(id, newName);return ResponseEntity.ok("Resource with ID " + id + " has been completely updated.");
}

原因:同样使用@RequestBody来接收请求体内容,并通过@PutMapping指定这是一个更新(替换)资源的操作,适用于需要替换整个资源实体的场景。

第五种:/create(POST请求,创建新资源)

前端传参:post、data(用于创建资源);后端接参:@PostMapping、@RequestBody

前端(Axios):

axios.post('/create', { name: 'New Resource' }).then(response => {console.log('Resource created successfully', response.data);}).catch(error => {console.error('Error creating resource', error);});

原因:POST请求是创建新资源的标准HTTP方法,通过请求体发送新资源的数据,遵循RESTful设计原则。

后端(Java Spring):

@PostMapping("/create")
public ResponseEntity<ResourceCreatedResponse> createNewResource(@RequestBody NewResourceRequest request) {String resourceName = request.getName();ResourceCreatedResponse response = service.createNewResource(resourceName);return ResponseEntity.status(HttpStatus.CREATED).body(response);
}

原因@PostMapping表明这是一个创建资源的操作,而@RequestBody用于解析请求体中的JSON数据到Java对象,HttpStatus.CREATED则表示响应状态码为201,符合HTTP标准中创建成功应返回的状态。

第六种:/search?keyword=example (GET请求,搜索资源)

前端传参:get、params;后端接参:@GetMapping、@RequestParam

前端(Axios):

axios.get('/search', { params: { keyword: 'example' } }).then(response => {console.log('Search results:', response.data);}).catch(error => {console.error('Error searching resources', error);});

原因:GET请求用于检索信息,这里通过查询参数传递搜索关键词,符合RESTful设计中对资源查询的处理方式。

后端(Java Spring):

@GetMapping("/search")
public ResponseEntity<List<Resource>> searchResources(@RequestParam("keyword") String keyword) {List<Resource> results = service.searchByKeyword(keyword);return ResponseEntity.ok(results);
}

原因@RequestParam用于捕获URL中的查询参数,便于处理搜索或过滤请求,返回资源列表作为搜索结果。

第七种:/batchDelete (DELETE请求,批量删除)

前端传参:delete、data(例如:[{id: 1}, {id: 2}]);后端接参:@DeleteMapping、@RequestBody

前端(Axios):

axios.delete('/batchDelete', { data: [{ id: 1 }, { id: 2 }] }).then(response => {console.log('Resources deleted in batch successfully', response.data);}).catch(error => {console.error('Error deleting resources in batch', error);});

注意:Axios的delete方法默认不支持发送请求体,若要发送请求体,需使用axios({ method: 'delete', url: '/...', data: yourData })的形式。

后端(Java Spring):

@DeleteMapping("/batchDelete")
public ResponseEntity<String> batchDeleteResources(@RequestBody List<Long> ids) {service.batchDelete(ids);return ResponseEntity.ok("Resources with IDs " + ids + " have been deleted.");
}

原因@DeleteMapping用于定义处理批量删除的端点,@RequestBody接收一个资源ID列表,适合处理需要同时删除多个资源的场景。

每种方式中,前端使用axios时,请求方法(如get, post, put, delete等)与HTTP动词相匹配,以符合RESTful原则。后端Java代码中,使用Spring框架的注解来定义请求的处理方法及参数的接收方式,确保数据能够正确地在前后端之间传递。

五、区别与选择

  1. GET请求

    • 前端:通常用于请求资源或搜索,可通过查询参数传递信息。
    • 后端注解
      • @GetMapping:处理GET请求,可以与路径变量(@PathVariable)或查询参数(@RequestParam)一起使用。
      • @PathVariable:用于从URL路径中提取参数。
      • @RequestParam:用于获取URL中的查询参数。
  2. POST请求

    • 前端:用于创建新资源或提交数据更改。
    • 后端注解
      • @PostMapping:处理POST请求,多用于接收表单数据或JSON对象。
      • @RequestBody:从请求体中接收数据并映射到Java对象。
  3. PUT请求

    • 前端:更新现有资源的全部信息。
    • 后端注解
      • @PutMapping:处理PUT请求,适用于资源的完整替换。
      • @RequestBody:从请求体中接收用于更新资源的全部数据。
  4. DELETE请求

    • 前端:删除指定资源。
    • 后端注解
      • @DeleteMapping:处理DELETE请求。
      • @PathVariable:如果通过路径删除,用于获取路径中的参数。
      • @RequestBody:虽然较少见,但在批量删除等场景中可能需要从请求体中接收数据。

六、最佳实践与注意事项

安全性考虑:

  • 避免使用GET进行修改操作: GET请求不应用于改变服务器状态的操作,因为它们可能会被浏览器预加载、被缓存或留在浏览历史中,增加无意中重复执行的风险。应使用POST、PUT或DELETE等方法进行数据修改或删除操作。
  • 加密敏感数据: 对于敏感数据的传输,无论使用哪种HTTP方法,都应采用HTTPS协议,以保证数据在传输过程中的安全,防止窃听和篡改。
  • 验证与授权: 实现合适的认证机制(如OAuth、JWT)和授权策略,确保只有合法用户能访问和修改数据。

性能优化建议:

  • 使用异步处理: 前端使用Ajax(如Axios)进行异步请求,可以避免页面刷新,提升用户体验。后端可以利用异步编程模型(如Java的CompletableFuture)处理耗时操作,避免阻塞主线程。
  • 合理设置缓存策略:
    • 对于静态资源和频繁请求但不经常变更的数据,使用HTTP缓存策略,如设置ETag、Last-Modified头或Cache-Control指令,减少服务器负载和网络延迟。
    • 利用浏览器缓存(GET请求),并通过适当的缓存过期策略保持数据新鲜度。
  • 分页与懒加载: 对大量数据进行分页展示,仅在需要时加载更多内容(懒加载),减少初次加载时间,提升响应速度。
  • 压缩响应: 启用GZIP压缩减少网络传输的数据量,尤其对于文本数据(如HTML、CSS、JavaScript和JSON)效果显著。
  • 数据库优化: 索引优化、查询优化、合理使用缓存(如Redis)来减轻数据库压力,提高数据读写速度。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

形式架构定义语言(ADL)

简介 形式规范 多年来&#xff0c;学术界一直在试图通过使用与测试截然不同且更加主动的方法来确保程序语义的正确执行&#xff1a;形式化方法。研究者们认为这种方法通过更加精确、无二义性的描述来达到让程序绝对地按照设计者的思想执行的目的。这种思想早期体现在Floyd在1…

STM32之OLED驱动函数

类似51单片机中的LCD1602驱动差不多&#xff0c; 1.oled驱动代码 oled.c #include "stm32f10x.h" #include "OLED_Font.h"/*引脚配置*/ #define OLED_W_SCL(x) GPIO_WriteBit(GPIOB, GPIO_Pin_8, (BitAction)(x)) #define OLED_W_SDA(x) GPIO_WriteBi…

Python入门(二)编程中的“真”与“假”,单双向选择的判断

编程中的“真”与“假” 在编程中&#xff0c;这种“真”、“假”状态我们用布尔数来表示&#xff0c;“真”是True&#xff0c;“假”是False。 另一种方式&#xff0c;是通过比较运算得到。 如图&#xff0c;3赋值给a&#xff0c;1赋值给b&#xff0c;进行大小的比较。 a &g…

U9的插件开发之BE插件(1)

U9插件可分为&#xff1a;BE插件、BP插件、UI插件&#xff1b; BE(Business Entity) 简单就是指实体&#xff0c;U9的元数据。 我的案例是设置BE默认值&#xff0c;即在单据新增时&#xff0c;设置单据某一个字段的默认值&#xff0c;具体如下&#xff1a; 1.插件开发工具&a…

Linux的目录结构 常用基础命令(2)

Linux的目录结构 根目录&#xff1a; 所有分区、目录、文件等的位置起点 整个树形目录结构中&#xff0c;使用独立的一个“/”表示 常见的子目录 /root /bin /boot /dev /etc /home /var /usr /sbin 基础知识 以 . 开头的文件均为隐藏文件 路径用/分开 / 不在第一位就…

plsql 高版本用不了 expaste 插件 问题

plsql 高版本用不了 expaste 插件 问题 其实不是版本问题&#xff0c;而是高版本的咩有在用这个插件&#xff0c;在另外一个功能里面&#xff0c; 查询你要的数据&#xff0c; 选择数据&#xff0c;右键&#xff0c;点 右键 复制为表达式列表&#xff0c;即可 在空白处粘贴…

【C++】C++11基础入门

目录 一、C11发展史&#xff1a; 二、列表初始化&#xff1a; 1、初始化&#xff1a; 2、initializer_list函数&#xff1a; 三、声明&#xff1a; 1、auto自动识别类型&#xff1a; 2、decltype&#xff1a; 3、nullptr&#xff1a; 四、范围for&#xff1a; 五、STL…

vue3+vue-baidu-map-3x 实现地图定位

文档地址&#xff1a;一个是2一个是3 https://dafrok.github.io/vue-baidu-map/#/zh/index vue-baidu-map-3x 1.首先要到百度地图开放平台上建一个账号&#xff0c;如果有百度账号可以直接登录百度地图-百万开发者首选的地图服务商,提供专属的行业解决方案 2.点击控制台&am…

V2X介绍

文章目录 什么是V2XV2X的发展史早期的DSRC后起之秀C-V2XC-V2X 和DSRC 两者的对比 什么是V2X 所谓V2X&#xff0c;与流行的B2B、B2C如出一辙&#xff0c;意为vehicle to everything&#xff0c;即车对外界的信息交换。车联网通过整合全球定位系统&#xff08;GPS&#xff09;导…

C#使用log4net结合sqlite数据库记录日志

0 前言 为什么要把日志存到数据库里? 因为结构化的数据库存储的日志信息,可以写专门的软件读取历史日志信息,通过各种条件筛选,可操作性极大增强,有这方面需求的开发人员可以考虑。 为什么选择SQLite? 轻量级数据库,免安装,数据库的常用的基本功能都有,可以随程序…

如何打开/解包星露谷物语XNB文件(附软件资源)

一、什么是 XNB 文件&#xff1f; 游戏将数据、地图和纹理存储在 .xnb 这种压缩数据文件中&#xff0c;它们在游戏的 Content 文件夹中。例如&#xff0c;对话期间显示的阿比盖尔的头像来自这个文件&#xff1a; Content\Portraits\Abigail.xnb。解包这个文件&#xff0c;你会…

SIP 业务举例之 Call Forwarding - No Answer(无应答呼叫转移)

目录 1. Call Forwarding - No Answer 简介 2. RFC5359 的 Call Forwarding - No Answer 信令流程 呼转开始 呼转完成 3. Call Forwording - No Answer 过程总结 博主wx:yuanlai45_csdn 博主qq:2777137742 想要 深入学习 5GC IMS 等通信知识(加入 51学通信),或者想要 …

ISO21434 信息安全开发流程咨询合规内容和步骤

ISO 21434是汽车网络安全风险管理的一项国际标准&#xff0c;旨在帮助汽车制造商和供应商识别、评估和管理车辆整个生命周期中的网络安全风险。以下是ISO 21434咨询可能包含的内容以及实施咨询的方法论步骤&#xff1a; 咨询内容&#xff1a; 标准解读与培训&#xff1a;帮助…

【Unity】Unity中文本中插入超链接且可点击响应,TextMeshPro的进阶用法

一、需求和尝试 今天遇到这样一个需求&#xff1a;在文本中插入超链接&#xff0c;且这个链接可以点击跳转对应的url&#xff0c;具体形式如下图所示。 其实这个有一个简单粗暴的方法&#xff0c;就是把需要加超链接的文本单独拿出来&#xff0c;和其他文本进行拼接&#xf…

【数据结构与算法】之队列详解

队列&#xff08;Queue&#xff09;是一种重要的线性数据结构&#xff0c;遵循先进先出、后进后出的原则。本文将更详细地介绍队列的概念、特点、Java 实现以及应用场景。 模运算小复习&#xff1a; a % b 的值总是小于b 5 % 4 1 5 % 2 1 1 % 5 1 4 % 5 4 1. 队列…

windows|常见的文件伪装方法

几种常见的文件伪装方法&#xff1a; 扩展名伪装unicode字符伪装压缩包伪装隐写术 方法仅限于学习目的&#xff0c;不用于任何恶意或非法用途。 ———— 一、扩展名伪装&#xff1a;假装是另一种类型的文件 修改文件的扩展名&#xff0c;使得文件看起来像其他类型的文件&a…

取消element-ui中账号和密码登录功能浏览器默认的填充色,element-ui登录账号密码输入框禁用浏览器默认填充色问题

标题 问题展示 修改后 <div class="loginForm"><el-formref="formB":model="formDataB":rules="rulesB"class="login-form"label-position="left"><el-form-item prop="userNo" clas…

CentOS 7(Linux)详细安装教程

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 一、CentOS镜像的下载&#xff08;准备工作&#xff09; 我选择的是其他镜像源的下载地址&#xff1a; Index of /centos-vault/7.6.1810/isos/x86_64/ | 南阳理工学院开源镜…

u盘装win10系统提示“windows无法安装到这个磁盘,选中的磁盘采用GPT分区形式”解决方法

我们在u盘安装原版win10 iso镜像时&#xff0c;发现在选择硬盘时提示了“windows无法安装到这个磁盘,选中的磁盘采用GPT分区形式”&#xff0c;直接导致了无法继续安装下去。出现这种情况要怎么解决呢&#xff1f;下面小编分享u盘安装win10系统提示“windows无法安装到这个磁盘…

Android Gradle

#1024程序员节&#xff5c;征文# Gradle 是一款强大的自动化构建工具&#xff0c;广泛应用于 Android 应用开发。它通过灵活的配置和丰富的插件系统&#xff0c;为项目构建提供了极大的便利。本文只是简单的介绍 Gradle 在 Android 开发中的使用&#xff0c;包括其核心概念、构…