GET和POST方法的区别

news/2024/4/29 9:06:41

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.cpky.cn/p/10867.html

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

相关文章

【数学建模】传染病模型笔记

传染病的基本数学模型&#xff0c;研究传染病的传播速度、空间范围、传播途径、动力学机理等问题&#xff0c;以指导对传染病的有效地预防和控制。常见的传染病模型按照传染病类型分为 SI、SIR、SIRS、SEIR 模型等&#xff0c;按照传播机理又分为基于常微分方程、偏微分方程、网…

mysql 数据库 基本介绍

一 数据 &#xff08;一&#xff09;数据是什么 描述事物的符号记录 包括数字&#xff0c;文字、图形、图像、声音、档案记录气 以“记录”形式按统一的格式进行存储 &#xff08;二&#xff09;数据的分类 1&#xff0c;结构化的数据 即有固定格式和有限长度的数据。例…

Java:接口

目录 1.接口的概念2.接口的语法规则3.接口使用4.接口的特性5.实现多个接口6.接口中的继承7.抽象类和接口的区别 1.接口的概念 在现实生活中&#xff0c;接口的例子比比皆是&#xff0c;比如&#xff1a;笔记本上的USB口&#xff0c;电源插座等。 电脑的USB口上&#xff0c;可以…

WP免费主题2个分享给需要的人

免费wordpress主题 粉色高端大气的免费wordpress主题&#xff0c;用免费的主题也可以搭建wordpress网站。 https://www.wpniu.com/themes/12.html 免费WP模板 绿色清爽的wordpress建站模板&#xff0c;用免费的WP模板也可以搭建出精美网站。 https://www.wpniu.com/themes/…

Redis监控工具

Redis 是一种 NoSQL 数据库系统&#xff0c;以其速度、性能和灵活的数据结构而闻名。Redis 在许多领域都表现出色&#xff0c;包括缓存、会话管理、游戏、排行榜、实时分析、地理空间、叫车、聊天/消息、媒体流和发布/订阅应用程序。Redis 数据集完全存储在内存中&#xff0c;这…

python flask服务如何注册到nacos

shigen坚持更新文章的博客写手&#xff0c;擅长Java、python、vue、shell等编程语言和各种应用程序、脚本的开发。记录成长&#xff0c;分享认知&#xff0c;留住感动。 个人IP&#xff1a;shigen 背景 shigen之前遇到了一个服务&#xff0c;需要结合nacos Spring security实现…