GET和POST方法的区别

GET和POST的区别

在我们开发项目的时候常常会在Controller层使用到POST方法或者GET方法,犹豫到底将接口定义为GET方法还是POST方法?那这两者之间有什么区别呢?

看一下官方定义:

GET 和 POST 是 HTTP 协议中最常用的两种请求方法,它们之间的区别主要体现在以下几个方面:

  1. 语义
    • GET:用于从服务器获取资源,不应该对服务器端的数据进行修改。GET 请求是幂等的,即多次执行相同的 GET 请求应该返回相同的结果,不会产生副作用。
    • POST:用于向服务器提交数据,通常用于创建新的资源或者对服务器端的数据进行修改。POST 请求不是幂等的,即多次执行相同的 POST 请求可能会产生不同的结果,可能会对服务器端的数据产生副作用。
  2. 参数传递
    • GET:参数通过 URL 的查询字符串(query string)传递,参数会附加在 URL 的末尾,如 http://example.com/resource?key1=value1&key2=value2。由于参数附加在 URL 中,有长度限制,并且会被保存在浏览器的历史记录和服务器的访问日志中。
    • POST:参数通过请求体(request body)传递,参数不会附加在 URL 中,而是作为请求体的一部分发送。POST 请求没有长度限制,可以传递大量的数据,且参数不会暴露在 URL 中,更加安全。
  3. 安全性
    • GET:由于参数暴露在 URL 中,可能会被恶意用户通过网络抓包工具等获取,因此不适合传递敏感信息,如密码等。GET 请求更适合用于获取公开信息。
    • POST:参数在请求体中发送,相对于 GET 请求更安全,适合传递敏感信息,如登录表单的用户名和密码等。
  4. 缓存
    • GET:请求结果可以被缓存,可以被浏览器缓存、代理服务器缓存等,如果请求相同的 URL,可以直接使用缓存结果,提高性能。
    • POST:请求结果通常不会被缓存,每次请求都会向服务器发送数据,不会使用缓存结果。
  5. 幂等性
    • GET:由于 GET 请求是幂等的,多次执行相同的 GET 请求应该返回相同的结果,不会对服务器端的数据产生影响,因此适合用于查询操作。
    • POST:POST 请求不是幂等的,多次执行相同的 POST 请求可能会产生不同的结果,可能会对服务器端的数据产生影响,因此适合用于对数据进行修改或者创建新的资源。

总结一下要点:

定义上:GET主要是用于获取资源,POST主要是创建新的资源或者对服务器端的数据进行修改

参数传递:GET主要通过参数传递,比如http://example.com/resource?key1=value1&key2=value2或者restful的形式``http://example.com/resource/value1/value2`。而POST主要将请求参数放在请求Body中,不会在url上直接体现;

但是,⚠️无论是GET还是POST在http协议下,传递数据都是不安全的,因为代理服务器还是可以拦截请求看到请求体的body,那GET就更不用说了;所以建议在网站上线时使用https,因为https对数据进行了加密,具体的可自行上网搜索如何保证数据安全性

缓存:例如在我们向服务器请求静态资源时,通常是GET请求,浏览器为了提高访问速度,通常会将静态资源缓存在浏览器;而POST请求不会

GET接收参数示例:(三种不同传参方式)
/*** 使用RequestParam接收参数,主要用于接收带?和&的GET请求参数* @param name* @param age* @return*/
@GetMapping("/testGet/normal")
public String testGetNormal(@RequestParam("name") String name, @RequestParam("age") Integer age) {return name + age;
}

在这里插入图片描述

⚠️:并不是只有POST请求才可以使用body传递参数,GET同样也可以,但是GET请求使用Body传递参数是有长度限制的

/*** 使用RequestBody接收Get方法的Body* @param person* @return*/
@GetMapping("/testGet")
public String testGetBody(@RequestBody Person person) {return person.getName() + person.getAge();
}

在这里插入图片描述

/*** 使用PathVariable接收参数,主要用于接收restFul风格的参数* @param name* @param age* @return*/
@GetMapping("/testGet/{name}/{age}")
public String testGet(@PathVariable("name") String name, @PathVariable("age") Integer age) {return name + age;
}

在这里插入图片描述

POST方法示例(三种不同传参方式)
@PostMapping("/testPost")
public String testPost(@RequestParam("name") String name, @RequestParam("age") Integer age) {return name + age;
}

在这里插入图片描述

@PostMapping("/testNormal/{name}/{age}")
public String testPostNormal(@PathVariable("name") String name, @PathVariable("age") Integer age) {return name + age;
}

在这里插入图片描述

@PostMapping("/testPost/body")
public String testPostBody(@RequestBody UserRegisterRequest userRegisterRequest) {return userRegisterRequest.getUserAccount() + userRegisterRequest.getUserPassword();
}

在这里插入图片描述

总结

可以看出有什么区别吗?其实使用下来没有什么区别;无非就是GET可以传递的参数大小有限制,而POST没有;所以有一些项目的所有接口都采用的了POST作为接口的调用形式,就是为了减少前后端的交流成本;

例如:

前端:你这b接口是POST还是GET啊?

后端:你不会看接口文档吗?😞

前端回怼:我就是看了接口文档,调用接口报错404才找你的😠

后端:好吧,我写错了😳

这里推荐一个接口插件knife4j,可以在编写完接口后自动生成接口文档

只要在后端的pom.xml文件中引入依赖

<dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-spring-boot-starter</artifactId><version>3.0.3</version>
</dependency>

声明一个配置类

@Configuration
@EnableSwagger2
@EnableKnife4j
public class SwaggerConfig {@Beanpublic Docket createRestApi() {return new Docket(DocumentationType.SWAGGER_2).useDefaultResponseMessages(false).apiInfo(apiInfo()).select().apis(RequestHandlerSelectors.basePackage("xxx.xxx.xxx.controller")).paths(PathSelectors.any()).build();}private ApiInfo apiInfo() {return new ApiInfoBuilder().description("项目接口").version("v1.1.0").title("API测试文档").build();}}

xxx.xxx.xxx.controller替换为自己的项目路径下的controller目录路径

然后访问:http://后端ip:后端端口号/doc.html,如果项目有加context-path,比如content-path=/api,访问地址要改为http://后端ip:后端端口号/api/doc.html

server:port: 8080servlet:context-path: /api

比如上面这个配置,就要访问http://localhost:8080/api/doc.html

然后就可以访问啦,里面有所有接口的详细信息,以及支持在线调试

在这里插入图片描述

如果觉得本篇文章对于你有帮助,可否点个小赞😺;篇幅较长建议收藏🫠;关注一手等待后续更新更多干货🚀

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

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

相关文章

爬虫学习 Scrapy中间件代理UA随机selenium使用

目录 中间件UA、代理处理---process_requestUA随机 代理处理seleniumscrapy 中间件 控制台操作 (百度只起个名 scrapy startproject mid scrapy genspider baidu baidu.com setting.py内 ROBOTSTXT_OBEY FalseLOG_LEVEL "WARNING"运行 scrapy crawl baidu middle…

ArcGIS分享图层数据的最佳方法

在工作中&#xff0c;经常需要将图层数据分享给其他人。 如下图所示&#xff0c;需要分享的是【CJDCQ】和【GHDLTB】&#xff0c;图层带有符号系统&#xff1a; 一、分享gdb数据库及lyr文件 分享数据自然要找到源数据&#xff1a; 但是&#xff0c;gdb数据是不带符号系统的&a…

微信小程序开发系列(三十四)·自定义组件的创建、注册以及使用(数据和方法事件的使用)

目录 1. 分类和简介 2. 公共组件 2.1 创建 2.2 注册 2.3 使用 3. 页面组件 3.1 创建 3.2 注册 3.3 使用 4. 组件的数据和方法的使用 4.1 组件数据的修改 4.2 方法事件的使用 1. 分类和简介 小程序目前已经支持组件化开发&#xff0c;可以将页面中的功能…

springboot基于spring boot的在线答题微信小程序

摘 要 在线答题微信小程序是考试中重要的一环&#xff0c;在线答题是学生获取任务信息的主要渠道。为了方便学生能够在网站上查看任务信息、考试&#xff0c;于是开发了基于 springboot框架设计与实现了一款简洁、轻便的在线答题微信小程序。本微信小程序解决了在线答题事务中的…

2.3 HTML5新增的常用标签

2.3.1 HTML5新增文档结构标签 在HTML5版本之前通常直接使用<div>标签进行网页整体布局&#xff0c;常见布局包括页眉、页脚、导航菜单和正文部分。为了区分文档结构中不同的<div>内容&#xff0c;一般会为其配上不同的id名称。例如&#xff1a; <div id"h…

FFmpeg转码参数说明及视频转码示例

-b : 设置音频或者视频的转码码率 -b:v 只设置视频码率 -b:a 只设置音频码率 -ab: 只设置音频码率, 默认码率大小为: 128k bit/s -g: 设置视频GOP大小,表示I帧之间的间隔,默认为12 -ar: 设置音频采样率,默认0 -ac: 设置音频通道数量 默认0 -bf: 设置连…

CTFHUB-web-信息泄漏

题目所在位置&#xff1a;技能树->web->信息泄漏 目录遍历 打开题目&#xff0c;我们进入的是这个页面 翻译过来就是 得到的信息就是&#xff1a;flag要在这些目录里面寻找&#xff0c;我们直接一个一个点开查看就行 发现得到一个flag.txt&#xff0c;点击打开得到flag …

鸿蒙Harmony应用开发—ArkTS声明式开发(容器组件:UIExtensionComponent (系统接口))

UIExtensionComponent用于支持在本页面内嵌入其他应用提供的UI。展示的内容在另外一个进程中运行&#xff0c;本应用并不参与其中的布局和渲染。 通常用于有进程隔离诉求的模块化开发场景。 说明&#xff1a; 该组件从API Version 10开始支持。后续版本如有新增内容&#xff0…

【Java】List, Set, Queue, Map 区别?

目录 List, Set, Queue, Map 区别&#xff1f; Collection和Collections List ArrayList 和 Array区别&#xff1f; ArrayList与LinkedList区别? ArrayList 能添加null吗&#xff1f; ArrayList 插入和删除时间复杂度&#xff1f; LinkedList 插入和删除时间复杂度&…

计算机网络-数据链路层

一、认识以太网 "以太网" 不是⼀种具体的网络&#xff0c;而是一种技术标准; 既包含了数据链路层的内容, 也包含了⼀些物理 层的内容。 例如&#xff1a;规定了网络拓扑结构&#xff0c;访问控制方式&#xff0c;传输速率等; 例如&#xff1a;以太网中的网线必须使用…

vxe-table表格组件的使用已经query函数扩展

最近新项目使用vue3typescript开发后台管理系统&#xff0c;基本上展示内容一致表格的方式展示&#xff0c;所以使用vxe-table组件来开发&#xff0c;主要是为了方便使用工具栏&#xff0c;以及其他表格操作。 vxe-table 开发文档&#xff1a;https://vxetable.cn/#/table/sta…

免费开源多层级多标签文本分类|文本分类接口|文本自动分类

一、开源项目介绍 一款多模态AI能力引擎&#xff0c;专注于提供自然语言处理&#xff08;NLP&#xff09;、情感分析、实体识别、图像识别与分类、OCR识别和语音识别等接口服务。该平台功能强大&#xff0c;支持本地化部署&#xff0c;并鼓励用户体验和开发者共同完善&#xf…

火车订票管理系统|基于springboot框架+ Mysql+Java+B/S结构的火车订票管理系统设计与实现(可运行源码+数据库+设计文档)

推荐阅读100套最新项目 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 目录 前台功能效果图 管理员功能登录前台功能效果图 用户功能模块 系统功能设计 数据库E-R图设计 lunwen…

代码随想录算法训练营第二十五天 | 216. 组合总和 III、17. 电话号码的字母组合

代码随想录算法训练营第二十五天 | 216. 组合总和 III、17. 电话号码的字母组合 216. 组合总和 III题目解法 17. 电话号码的字母组合题目解法 感悟 216. 组合总和 III 题目 解法 修改上一天组合的代码 class Solution { public:vector<vector<int>> result;vect…

双向SSM: Vision Mamba Encoder

文章目录 Vision Mamba Encoder初始化输入映射序列变换参数映射BC参数映射delta参数映射 SSM参数初始化A , D矩阵初始化delta参数初始化 双向SSM初始化参数初始化 前向输入映射fast_pathuse_fast_pathno use_fast_path 双向SSMv1前向后向 v2前向后向 Vision Mamba Encoder Vis…

数据结构的概念大合集04(队列)

概念大合集04 1、队列1.1 队列的定义1.2队列的顺序存储1.2.1 顺序队1.2.2 顺序队的基本运算的基本思想1.2.3 顺序队的4要素的基本思想 1.3 环形队列1.3.1 环形队列的定义1.3.1 环形队列的实现 1.4 队列的链式存储1.4.1 链队1.4.2 链队的实现方式1.4.3 链队的4要素的基本思想 1.…

C语言之快速排序

目录 一 简介 二 代码实现 快速排序基本原理&#xff1a; C语言实现快速排序的核心函数&#xff1a; 三 时空复杂度 A.时间复杂度 B.空间复杂度 C.总结&#xff1a; 一 简介 快速排序是一种高效的、基于分治策略的比较排序算法&#xff0c;由英国计算机科学家C.A.R. H…

Arthas使用案例(二)

说明&#xff1a;记录一次使用Arthas排查测试环境正在运行的项目BUG&#xff1b; 场景 有一个定时任务&#xff0c;该定时任务是定时去拉取某FTP服务器上的文件&#xff0c;进行备份、读取、解析等一系列操作。 而现在&#xff0c;因为开发环境是Windows&#xff0c; 线上项…

FFmpeg 常用命令汇总

​​​​​​经常用到ffmpeg做一些视频数据的处理转换等&#xff0c;用来做测试&#xff0c;今天总结了一下&#xff0c;参考了网上部分朋友的经验&#xff0c;一起在这里汇总了一下。 1、ffmpeg使用语法 命令格式&#xff1a; ffmpeg -i [输入文件名] [参数选项] -f [格…

Spring整合RabbitMQ

需求&#xff1a;使用Spring整合RabbitMQ 步骤&#xff1a; 生产者 1.创建生产者工程 2.添加依赖 3.配置整合 4.编写代码发送消息 消费者步骤相同 生产者 导入依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://…