前后端请求一致性学习

news2024/10/17 8:24:21

        在进行前后端分离开发项目的过程中,前后端同学往往需要依照接口文档的基本信息以及相应的响应格式进行接口请求的开发,在这个过程中涉及到常见的Get、Post、Put、Patch等等的请求,相应的前后端的书写格式是什么,这篇文章进行一个记录学习

举例:接口文档具备的三部分描述

一、GET请求 

前端发送特点: get请求通常用于客户端向服务器获取数据,其参数携带在请求的URL地址上

后端接收特点:通过GetMapper(‘url’)  + @RequsetParam 或 @PathVariable 进行接收

具体的:

接收方式适用情况特点
GetMapper  + @RequsetParam前端请求路径为:/category/detail ?{参数}参数拼在路径之后
GetMapper  + @PathVariable前端请求路径为:/category/detail{参数}参数拼在路径中

方式一:

(前端)

// 获取文章列表接口
export const articleListService = (params) => {
    // 发送请求
    // params 可能是一个对象,比如 { category: 'technology', limit: 10 }
    return request.get('/category/detail',{params : params})
}

 (后端)

    @GetMapping("/detail")
    public Result<Category> getCategoryDetail(@RequestParam(vlaue = 'id') Integer id) {
        // 获取文章分类详情
        return articleCategoryService.getCategoryDetail(id);
    }

方式二:

(前端)

export const getArticleByIdService = (id) => {  
    return request.get(`/article/${id}`);  
}

(后端)

@GetMapping("/article/{id}")  
public ResponseEntity<Article> getArticleById(@PathVariable Long id) {  
    // 方法实现  
}

注意点:

1.针对一些非必填的参数,可以使用required关键字来标识,同时必须设置默认值defaultValue,如getOrder方法中对price参数的获取:

@RequestParam(
            value = "name",
            required = false,
            defaultValue = "0") Integer name

二、Post请求

前端发送特点:Post请求用于向服务器发送数据,数据可以以 application/json 或 application/x-www-form-urlencoded 格式发送。

后端接收特点:使用PostMapper + @RequestBody 或 @RequsetParam接收

具体的:

接收方式适用情况特点
PostMapper + @RequestBody接收 JSON请求体格式
PostMapper + @RequsetParam接收处理表单数据

方式一:

(前端)使用

// 上传用户头像  
export const userAvatarUploadService = (file) => {  
    let formData = new FormData();  
    formData.append('file', file); // 注意这里使用 'file' 作为键名,与后端 @RequestParam("file") 对应  
  
    // 发送请求  
    return request.post('/user/upload', formData, {  
        headers: {  
            'Content-Type': 'multipart/form-data' // 通常不需要显式设置这个头,因为 axios 或 fetch 会自动设置  
        }  
    });  
}

(后端)

    @PostMapping()
    public Result upload(@RequestParam MultipartFile file){
        // 文件上传
        return uploadService.upload(file);
    }
}

方式二:

(前端)

// 添加文章接口
export const articleAddService = (articleModel) => {
    // 发送请求
    return request.post('/article',articleModel)
}

(后端)

    @PostMapping()
    public Result addArticle(@RequestBody @Validated Article article) {
        // 添加文章
        articleService.addArticle(article);
        return Result.success();
    }

三、PUT 请求 

前端请求特点: PUT请求常用于更新数据资源,于POST请求写法类似,通过请求体发送数据

后端接收特点:使用 @PutMapper + @RequsetBody  接收 PUT 请求的 JSON 数据。

(前端)

// 修改文章接口
export const articleUpdateService = (articleModel) => {
    // 发送请求
    return request.put('/article',articleModel)
}

(后端)

    @PutMapping()
    public Result updateArticle(@RequestBody @Validated Article article) {
        // 更新文章
        articleService.updateArticle(article);
        return Result.success();
    }

四、DELETE 请求

前端发送特点:DELETE主要用于删除数据资源,通过URL发送资源的标识符,与GET请求书写

后端接收特点:通过@DeleteMapper + @PathVariable 接收标识符,@Requsetparam

方式一

(前端)

// 删除文章接口
export const articleDeleteService = (id) => {
    // 发送请求
    return request.delete(`/article/${id}`)
}

(后端)

    @DeleteMapping(/{id})
    public Result deleteArticle(@PathVariable @Validated Integer id) {
        articleService.deleteArticle(id);
        return Result.success();
    }

方式二:

(前端)

// 删除文章接口
export const articleDeleteService = (id) => {
    // 发送请求
    return request.delete(`/article?id=` + id)
}

(后端)

    @DeleteMapping()
    public Result deleteArticle(@RequestParam @Validated Integer id) {
        articleService.deleteArticle(id);
        return Result.success();
    }

五、PATCH请求

前端请求特点:PATCH请求用于资源的部分内容的更新;可能会在资源不存在时去创建它

后端接收特点:使用 @PatchMapping + @Requestparam 或 @RequestBody

方式一:

(前端)

// 修改用户头像
export const userAvatarUpdateService = (avatarUrl) => {
    let params = new URLSearchParams()
    params.append('avatarUrl',avatarUrl)
    // 发送请求
    return request.patch('/user/updateAvatar',params)
}

(后端) 

    @PatchMapping("/updateAvatar")
    public Result updateAvatar(@RequestParam @URL String avatarUrl) {
        // 更新用户头像
        userService.updateAvatar(avatarUrl);
        return Result.success();
    }

方式二:

(前端)

// 修改用户密码
export const userPasswordUpdateService = (passwordData) => {
    // 发送请求
    return request.patch('/user/updatePwd',JSON.stringify(passwordData), {  
        headers: {  
            'Content-Type': 'application/json'  
        }})
    }

(后端)

    @PatchMapping("/updatePwd")
    public Result updatePwd(@RequestBody @Validated UserPwdDTO userPwdDTO) {
        // 更新用户密码
        return userService.updatePwd(userPwdDTO);
    }

六、三大注解的使用场景、区别、与总结

总结

注解请求参数位置请求方式支持的Content-Type请求示例
@PathVariableUrlGetGet请求没有Content-Type/user/1
@RequestParamUrl、BodyGet / Post / Put / Delete/  Patch form-data,x-www-form-urlencoded/user?name=wzc&age=23
@RequestBodyBodyPost / Put / Delete / Patch application/json

@PathVariable

【支持的请求方式】

  • 支持请求方式:GET
  • 参数传递:在URL上直接传递

【使用场景】

在向服务端获取简单的数据的过程中可以使用,例如根据ID值查询学生信息,就会在前端发送GET请求,后台使用@GetMapper + @PathVariable接收

【优点】

简单类型的数据绑定,例如 int 、string

【缺点】

1. 当需要传递的参数过多,就不好写了,所以一般适用于单参数查询方法上

2. id暴露在url上,对于不方便泄露ID的值请求,最好不要使用,否则暴露网站url的特点。

3. 只支持Get方式,请求方式有局限性

4. 不支持复杂数据类型,自定义数据类型

【使用说明】

步骤   格式        说明
前端发送的请求URLhttp://localhost:8080/user/detail/1-
后端接收参数@GetMapper(“/user/detail/{id}”)这里的id是路径上的参数,传什么值接收什么值
后端映射值@PathVariable Integer id这里的方法参数id要与路径变量参数id同名,因为@PathVariable没有指定别名的注解变量

【注意事项】

  • @PathVariable注解源码中只有一个参数,不填的默认是绑定到与路径参数同名的形参变量

  • 如果要接收多个路径变量,则需要声明多个@PathVariable变量

@RequestParam

【支持的请求方式】

  • 支持请求方式:GET,POST,PUT,DELETE
  • 参数传递:在Body中传递
  • 支持的Content-Type:application/json, url

【使用场景】

对于多参数查询时比较常用到,比如跟据文章分类、文章标题内容模糊查询文章,就会发送POST请求,后台使用RequestParam接收

【优点】

 能够轻松地从URL中提取参数。

【缺点】

1. 由于 url 长度有限制,所以参数需要限制数量和值的长度,不然url过于臃肿。

2. 安全性较低,因为查询参数会暴露在URL中。

3. 对于复杂或结构化的数据(如JSON、XML等)处理不够灵活。

【使用说明】

  • 在控制器方法的参数前使用@RequestParam注解,并指定参数名称(可选)和默认值(可选)。
  • 例如:@RequestParam(name = "id", defaultValue = "1") Long id

【注意事项】

@RequestParam拥有三个参数:

1. value、name 属性:标识请求参数名(必须配置)

2. required属性 :参数是否必传,默认为 true,可以设置为非必传 false;(如果设置了必传或默认,请求未传递参数,将会抛出异常)

3. defaultValue:参数默认值,如果设置了该值,required 将会自动设置为 false

@RequestBody

【支持的请求方式】

  • 支持请求方式:GET,POST,PUT,DELETE、PATCH
  • 参数传递:在Body中传递
  • 支持的Content-Type:application/json, application/xml

【使用场景】

最常用的一种注解,用于处理HTTP请求的请求体(body)中的数据,用于POST、PUT和PATCH请求中,接收JSON、XML等结构化的数据

【优点】

1. 自动将请求体中的数据反序列化为Java对象。

2. 能够处理复杂和结构化的数据。

3. 提供了数据验证和绑定的功能。

【缺点】

对于简单数据(如单个字符串、整数等)处理不够简洁。

【使用说明】

  • 在控制器方法的参数前使用@RequestBody注解。
  • 确保请求体的内容类型(Content-Type)与Java对象的类型相匹配(如application/json)。
  • 例如:@RequestBody MyObject myObject

【注意事项】

1. 使用@RequestBody时,通常不需要在方法参数中指定参数名称,因为整个请求体都会被反序列化为指定的Java对象。

2. @RequestBody注解只拥有一个参数 : required 默认为 true,即对象中的属性必须有一个要传,否则会抛出异常。

七、四大请求方式总结

以下是根据您提供的信息整理成的表格,对HTTP请求方式、数据库操作、请求参数位置及Spring MVC注解进行了总结:

HTTP请求方式数据库操作请求参数位置Spring MVC注解说明
GET查询URI查询参数@RequestParam(也可通过URI路径变量@PathVariable获取)不修改数据库,只是查询;参数通常放在URL中
POST增加RequestBody@RequestBody, @RequestParam(非标准,但可用于简单参数)增加记录到数据库;复杂数据通常放在请求体中
PUT更新RequestBody@RequestBody更新数据库中的记录;数据通常放在请求体中
DELETE删除通常无参数(可通过URI路径变量@PathVariable指定资源)@PathVariable(用于指定要删除的资源ID)从数据库中删除记录;通常不需要额外参数,除非是指定资源的ID

注意

  1. @PathVariable:用于处理URI路径中的变量部分,通常用于指定要操作的具体资源(如通过ID删除特定记录)。

  2. @RequestHeader@CookieValue:分别用于处理HTTP请求头和Cookie中的信息。

  3. 请求参数位置:对于GET请求,参数通常放在URL的查询字符串中。对于POST、PUT和DELETE请求,复杂数据通常放在请求体中(使用@RequestBody),而简单数据(如ID)可能通过URI路径变量(@PathVariable)或表单数据(在POST请求中,使用@RequestParam,但内容类型为application/x-www-form-urlencoded)传递。

  4. DELETE请求与参数:虽然DELETE请求通常不需要额外的请求体参数(因为它通常用于删除由URI指定的资源),但有时可能需要通过URI路径变量来指定要删除的资源ID。

  5. 处理 request uri 部分的注解,路径参数变量:@PathVariable;
  6. 处理request header部分的注解: @RequestHeader, @CookieValue,@RequestParam;
  7. 处理request body部分的注解:@RequestParam, @RequestBody; 

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

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

相关文章

keil 配置栈溢出保护(arm)

1.前提是keil 配置为arm-gcc 编译器环境 2.配置编译项加上 -fstack-protector-strong 栈溢出的测试代码: void aaa(int a, char c) { char arr[5]; arr[a] = c; } aaa(8, d);//任意地方调用,超过数组arr的元素 添加代码栈溢出检测: uint32_t __stack_chk_gua…

WhatsApp防死号应该怎么做?

“WhatsApp又死号了”——外贸人的噩梦每天都会上演。号损是小事&#xff0c;重要是是成千上万的客户累计与聊天记录被一扫而空&#xff0c;所以相信我&#xff0c;当你准备好最WhatsApp&#xff0c;那么WhatsApp账号养成的操作从一开始就要注意并且牢记&#xff01;下面给大家…

Golang | Leetcode Golang题解之第482题秘钥格式化

题目&#xff1a; 题解&#xff1a; func licenseKeyFormatting(s string, k int) string {ans : []byte{}for i, cnt : len(s)-1, 0; i > 0; i-- {if s[i] ! - {ans append(ans, byte(unicode.ToUpper(rune(s[i]))))cntif cnt%k 0 {ans append(ans, -)}}}if len(ans) &…

Unity Spine优化思路

最近终于闲下来了&#xff0c;于是开始把近期探索到的unity相关优化整理起来。 我们的项目采用的人物表现方式是spine动画&#xff0c;这在2D游戏里算比较常见的解决方案了&#xff0c;但是里面有一些设置需要提前注意一下&#xff0c;否则会造成不必要的性能浪费。 养成读官…

【实战指南】Vue.js 介绍组件数据绑定路由构建高效前端应用

学习总结 1、掌握 JAVA入门到进阶知识(持续写作中……&#xff09; 2、学会Oracle数据库入门到入土用法(创作中……&#xff09; 3、手把手教你开发炫酷的vbs脚本制作(完善中……&#xff09; 4、牛逼哄哄的 IDEA编程利器技巧(编写中……&#xff09; 5、面经吐血整理的 面试技…

WPF入门_01布局

WPF布局包括两个阶段&#xff1a;一个测量&#xff08;measure&#xff09;阶段和一个排列(arrange)阶段.每个Panel都提供了自己的MeasureOverride和ArrangeOverride方法 1、Canvas 布局控件 Canvas面板是最轻量级的布局容器&#xff0c;它不会自动调整内部元素的排列和大小&…

仿 Mac 个人网站开发 |项目复盘

一、前言 1.1 灵感来源 早年有幸看到国外大佬做的一个 基于 Web 的 Windows XP 桌面娱乐系统, 那时刚好有搭建一个个人博客的想法, 所以就想是否可以基于 WEB 实现一个仿 Mac UI 的个人博客, 以应用的形式来展示博客各个功能! 1.2 相关链接(求个 Star) 前端开源代码后端开源…

计算机网络—vlan(虚拟局域网)

内容补充 冲突域 如果两台设备同时发送数据&#xff0c;他们的数据会互相干扰&#xff0c;那么他们就处于同一冲突域&#xff0c;例如集线器&#xff08;总线型&#xff0c;所有设备共享带宽&#xff09;的所有端口都处于冲突域。 广播域 如果一台设备发送数据&#xff0c;…

怎么为pdf文件设置密码?几种PDF文件设置密码的方法推荐

怎么为pdf文件设置密码&#xff1f;设置PDF文件密码&#xff0c;正是应对这一挑战的有效手段之一。通过为PDF文件设置密码&#xff0c;我们能够为文档加上一道安全锁&#xff0c;确保只有掌握密码的用户才能打开和查看文件内容。这一措施不仅保护了文档的隐私性&#xff0c;还防…

【C++11入门】新特性总结之lambda表达式

现代C语言的核心特征之一&#xff1a;lambda表达式。虽然其它编程语言早已具备了这种特性&#xff0c;但直到C11标准发布&#xff0c;C11才具备了lambda表达式。本节主要讲解lambda表达式的语法和使用方法。具体包括&#xff1a;捕获列表、可选参数列表、可选异常说明符、可选返…

5分钟精通Windows环境变量

科普内容 what why how&#xff08;WWH&#xff09;三步走 1. what&#xff1a;Windows环境变量是什么 Windows环境变量&#xff0c;本质上是告诉了Windows操作系统一堆文件夹路径&#xff0c;如下图 2. why&#xff1a; 创造Windows环境变量的目的 发明Windows环境变量是为了…

多机编队—(3)Fast_planner无人机模型替换为Turtlebot3模型实现无地图的轨迹规划

文章目录 前言一、模型替换二、Riz可视化三、坐标变换四、轨迹规划最后 前言 前段时间已经成功将Fast_planner配置到ubuntu机器人中&#xff0c;这段时间将Fast_planner中的无人机模型替换为了Turtlebot3_waffle模型&#xff0c;机器人识别到环境中的三维障碍物信息&#xff0…

HarmonyOS开发(ArkUI简单使用)

一、开发准备 1.官网 https://developer.huawei.com/consumer/cn/ 2.工具 DevEco Studio 下载&#xff1a; 下载中心 | 华为开发者联盟-HarmonyOS开发者官网&#xff0c;共建鸿蒙生态 3.安装 4.开发组件ArkTs ArkTS是HarmonyOS主力应用开发语言。它在TypeScript&#xf…

分享一个关于产线工控安全的主机加固方案

在数字化时代&#xff0c;数据安全是企业运营的重中之重。勒索病毒作为一种新型的网络攻击手段&#xff0c;已经成为全球范围内企业面临的严峻挑战。最近&#xff0c;一起震惊全球的勒索病毒事件再次敲响了警钟&#xff1a;一家国际航运巨头遭受了勒索软件攻击&#xff0c;导致…

设计模式和软件框架的关系

设计模式和软件框架在软件开发中都有助于解决复杂问题和提高代码质量&#xff0c;但它们在概念和使用上存在一些区别。它们的关系可以通过以下几点理解&#xff1a; 层次与抽象程度 设计模式&#xff08;Design Patterns&#xff09;是一组通用的、可复用的解决方案&#xff0…

Android10 recent键相关总结

目录 初始化流程 点击Recent键流程 RecentsActivity 显示流程 RecentsModel 获取数据管理类 RecentsActivity 布局 已处于Recent界面时 点击recent 空白区域 点击返回键 recent组件配置 Android10 Recent 功能由 System UI&#xff0c;Launcher共同实现。 初始化流程 …

注册_登录安全分析报告:宝马中国

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造成亏损无底洞…

前端开发攻略---取消已经发出但是还未响应的网络请求

目录 注意&#xff1a; 1、Axios实现 2、Fetch实现 3、XHR实现 注意&#xff1a; 当请求被取消时&#xff0c;只会本地停止处理此次请求&#xff0c;服务器仍然可能已经接收到了并处理了该请求。开发时应当及时和后端进行友好沟通。 1、Axios实现 <!DOCTYPE html> &…

Map 双列集合根接口 HashMap TreeMap

Map接口是一种双列集合,它的每一个元素都包含一个键对象Key和值Value 键和值直接存在一种对应关系 称为映射 从Map集中中访问元素, 只要指定了Key 就是找到对应的Value 常用方法 HashMap实现类无重复键无序 它是Map 接口的一个实现类,用于存储键值映射关系,并且HashMap 集合没…

51单片机快速入门之 LED点阵 结合74hc595 的应用 2024/10/16

51单片机快速入门之 LED点阵 结合74hc595 的应用 74HC595是一种常用的数字电路芯片&#xff0c;具有串行输入并行输出的功能。它主要由两个部分组成&#xff1a;一个8位的移位寄存器和一个8位的存储寄存器。数据通过串行输入管脚&#xff08;DS&#xff09;逐位输入&#xff0…