HTTP中GET请求和POST请求的区别

news2024/11/27 23:45:36

前言

HTTP(超文本传输协议)是用于在 Web 浏览器和 Web 服务器之间传输数据的协议。在 HTTP 中,GET 和 POST 是两种常见的请求方法。一般我们在浏览器输入一个网址访问网站都是 GET 请求;在 FORM 表单中,可以通过设置 Method 指定提交方式为 GET 或者 POST 提交方式,默认为 GET 提交方式。它们在数据传输和使用方式上存在一些区别。GET 请求用于获取资源,将参数附加在 URL 末尾;而 POST 请求用于提交数据,参数包含在请求的主体(requset body)中。根据具体需求和安全性考虑,选择适当的请求方法。

基本区别

  • GET 请求将参数包含在 URL 中,POST 请求是将参数放在 request body 中

这是什么意思呢?这里我模拟两个请求

当我分别点击两个按钮

GET 请求:

POST 请求:

可以看出 GET 请求会将参数包含在 URL 中,而 POST 则会将参数放在 request body 中(这里我没有进行展示)

  • GET 在浏览器回退时无害,POST 在浏览器回退会再次提交请求

浏览器中使用 GET 请求时,当用户点击浏览器的回退按钮返回到之前的页面时,GET 请求不会对页面产生影响或重复提交请求。而对于 POST 请求,当用户点击浏览器的回退按钮返回到之前的页面时,浏览器可能会再次提交之前的 POST 请求。

  • GET 产生的 URL 可以保存在浏览器书签中,而 POST 不会

GET 请求产生的 URL 包含了查询字符串参数,可以直接将带有参数的 URL 保存为浏览器书签,方便以后再次访问。因为 GET 请求的参数直接暴露在 URL 中,所以可以轻松地将包含参数的 URL 添加到书签栏或收藏夹中。

而对于 POST 请求,由于参数是通过请求的主体传递的,并不直接暴露在 URL 中,所以不能将 POST 请求的完整 URL 直接保存为书签。

  • GET 请求会被浏览器主动 cache,而 POST 不会,除非手动设置。

当浏览器收到 GET 请求的响应时,它会检查响应的缓存标识(例如响应头中的 Cache-Control 和 Expires 字段),如果响应可以被缓存且缓存未过期,浏览器会将响应保存在缓存中。当下次发送相同的 GET 请求时,浏览器会直接从缓存中获取响应,而不会向服务器发送请求。

相比之下,对于 POST 请求,默认情况下,浏览器不会对响应进行缓存。因为 POST 请求通常用于向服务器提交数据,而数据的状态可能会在每次请求中发生变化,因此缓存 POST 请求的响应可能导致不正确的结果。如果希望对 POST 请求的响应进行缓存,开发人员需要在服务器的响应中设置适当的缓存标识(如 Cache-Control 和 Expires),并且浏览器需要遵循这些设置进行缓存。

  • GET 请求只能进行 url 编码,而 POST 支持多种编码方式。

当通过 GET 请求传递参数时,参数值会被 URL 编码。URL 编码是一种将特殊字符转换为特定格式的编码方式,以便在 URL 中进行传输。特殊字符如空格、问号、等号等会被替换成特殊编码形式,比如使用”%20″代替空格。

而对于 POST 请求,可以使用多种编码方式来传递参数。最常见的编码方式是 URL 编码(application/x-www-form-urlencoded),它类似于 GET 请求中的编码方式,将参数转换为 URL 编码形式。此外,还可以使用其他编码方式,如 multipart/form-data 编码,用于支持上传文件或二进制数据的传输。

通过 POST 请求,可以根据具体的需求和数据类型,选择合适的编码方式来传递参数。不同的编码方式适用于不同的场景,可以提供更丰富的参数传递和数据处理能力。

  • GET 请求在 URL 中传送的参数是有长度限制的,而 POST 没有。

当使用 GET 请求时,参数会以查询字符串的形式附加在 URL 上。然而,由于部分浏览器对 URL 长度有限制,因此 GET 请求在传递参数时存在长度限制。

相比之下,POST 请求将参数放置在请求主体(Request Body)中,而不受 URL 长度限制。这意味着当需要传递大量数据、上传文件或进行编码转换等操作时,通常会选择使用 POST 请求。

  • 对参数的数据类型,GET 只接受 ASCII 字符,而 POST 没有限制。

由于 URL 的限制和查询字符串的传递方式,GET 请求中的参数通常需要进行 URL 编码,以确保特殊字符和非 ASCII 字符能够正确传输。URL 编码会将特殊字符转换为特定的编码形式,以确保其在 URL 中的正确性和可传递性。

相比之下,POST 请求的参数可以更自由地传输各种类型的数据,包括特殊字符和非 ASCII 字符,而不需要像 GET 请求那样进行 URL 编码。这是因为 POST 请求将参数包含在请求主体中,而不是直接暴露在 URL 中。

小知识

GET 请求比 POST 请求快

当然这不是绝对的,如果排除其他因素,仅考虑 GET 和 POST 请求本身的差异,那么可以说在某些情况下 GET 请求可能比 POST 请求更快。
这是为什么呢?
这是因为 POST 在真正接收数据之前会先将请求头发送给服务器进行确认,然后才真正发送数据。


POST 请求的过程:

  1. 浏览器请求建立 TCP 连接(第一次握手)。
  2. 服务器确认并接受 TCP 连接请求(第二次握手)。
  3. 浏览器发送包含 POST 请求头的小型数据包(第三次握手),同时 HTTP 也在此时进行第一次数据发送。
  4. 服务器返回 100 Continue 响应,表示准备接收请求主体。
  5. 浏览器继续发送包含请求主体的数据。
  6. 服务器接收完整的请求后进行处理,并返回 200 OK 响应。

GET 请求的过程:

  1. 浏览器请求建立 TCP 连接(第一次握手)。
  2. 服务器确认并接受 TCP 连接请求(第二次握手)。
  3. 浏览器发送包含 GET 请求头和数据的小型数据包(第三次握手),同时 HTTP 也在此时进行第一次数据发送。
  4. 服务器接收到请求后进行处理,并返回 200 OK 响应。

也因此 GET 只产生一个 TCP 数据包;而 POST 产生两个 TCP 数据包。

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

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

相关文章

Mac端简单好用的程序创建工具:VMware InstallBuilder Enterprise

VMware InstallBuilder Enterprise for Mac是一款用于为台式机和服务器软件构建跨平台安装程序的开发工具。使用InstallBuilder,您可以从单个项目文件和构建环境中为Linux,Windows,Mac OS X,Solaris和其他平台快速创建动态&#x…

Windows下mosquitto服务端和MQTT.fx客户端搭建模拟环境

第一部分 Mosquitto安装测试 一、概念梳理 1、Mosquitto是一款实现了消息推送协议MQTT 3.1的开源消息代理软件,提供轻量级的、支持可订阅/可发布的消息推送模式,是设备与设备之间的短消息通信变得简单,广泛应用于低功耗传感器、手机&#xff…

django跨域设置

1.安装 (venv) ***\data_analyse_web>pip install django-cors-headers 2.添加应用 :在settings.py中添加应用,放到任意位置都行 INSTALLED_APPS {# ...corsheaders,# ... } 3. 设置中间层,在settings.py中添加中间层,放到最前面 MIDDLEWARE [c…

【设计模式】23种设计模式——原型模式Prototype(原理讲解+应用场景介绍+案例介绍+Java代码实现)

原型模式 介绍 原型模式指用通过拷贝原型实例创建新的实例,新实例和原型实例的属性完全一致原型模式是一种创建型设计模式工作原理是通过调用原型实例的 clone()方法来完成克隆,原型实例需要实现Cloneable接口,并重写clone()方法需要为每个…

WSR-88D天气雷达工作模式、监测目标、反射率含义讲解

一、WSR-88D 简介 WSR-88D是天气监视多普勒雷达之一。自 1988 年首次建造和测试以来,它已在包括阿拉斯加和夏威夷在内的美国 160 多个地点安装和使用。WSR-88D也已安装在波多黎各和太平洋的几个岛屿。 WSR-88D雷达发射功率为750000瓦(平均灯泡只有75瓦)!这种功率使雷达产…

03. 自定义镜像 Dockerfile

目录 1、前言 2、构建镜像的方式 2.1、docker commit 2.1.1、先查看下当前的容器 2.1.2、生成该容器镜像 2.1.3、查看镜像列表 2.2、Dockerfile 2.2.1、创建Dockerfile文件 2.2.2、编写Dockerfile文件 2.2.3、构建镜像 2.2.4、使用该镜像生成容器 3、Dockerfile 3…

Docker 网络、资源控制

Docker 网络、资源控制 一、Docker 网络1、Docker 网络实现原理2、Docker 的网络模式:1.host模式2.container模式3.none模式4.bridge模式5.自定义网络 二、资源控制1.CPU 资源控制(1…

用echarts绘制流程图

getEchart1() {echarts.init(document.getElementById(echart1)).dispose();var chartDom document.getElementById(echart1);this.myChart echarts.init(chartDom);var charts {nodes: [ // 节点{name: 开始, value: [0, 500],label: {borderWidth: 1, // 边框宽度borderRa…

【CMU15-445 FALL 2022】Project #1 - Buffer Pool

About 实验官网 Project #1 - Buffer Pool在线评测网站 gradescope Lab Task #1 - Extendible Hash Table 详见——【CMU15-445 FALL 2022】Project #1 - Extendable Hashing 如果链接失效,请查看当前平台我之前发布的文章。 Task #2 - LRU-K Replacement Polic…

flink Mysql CDC(动态加表)、postgresqlCDC 和 CDC无锁算法

flinkCDC - 功能验证记录 flink 与cdc 版本使用搭配:flink cdc参数说明原理分析(DBLog)无锁算法论文 mysql cdccdc api 动态加表flink cdc sql 性能压测flink cdc api 性能压测 PostgreSqlCDC执行更新语句,会出现 2 种情况 cdc si…

【数据挖掘】bytewax 与 ydata工具可实时了解您的数据

一、说明 在这篇博文中,我们将介绍如何将开源流式处理解决方案 bytewax 与 ydata 分析相结合并加以利用,以提高流式处理流的质量。 STream 处理支持在传输中和存储之前对数据进行实时分析,并且可以是有状态的,也可以是无状态的。 …

[STL]vector使用介绍

[STL]vector使用介绍 注:文内代码均在Visual Studio 2013下进行测试,不同的编译器下在扩容大小等方面可能有所不同,但不影响各接口函数的使用。 文章目录 [STL]vector使用介绍1. vector介绍2. 构造函数3. 迭代器相关函数begin函数和end函数的…

实现点击复制到剪切板功能

该功能使用VueUse实现 什么是 VueUse VueUse不是Vue.use,它是为Vue 2和3服务的一套Vue Composition API的常用工具集,是目前世界上Star最高的同类型库之一。它的初衷就是将一切原本并不支持响应式的JS API变得支持响应式,省去程序员自己写相…

jmeter常用的提取器(正则表达式和JSON提取器)

jmeter常用的后置处理器有两种提取数据: 1、JSON提取器 获取后可以将变量token引用到其他所需要的地方 (正则表达式和JSON提取器):2023接口自动化测试框架必会两大神器:正则提取器和Jsonpath提取器_哔哩哔哩_bilibilihttps://www.bilibili.…

uniapp实战

上面是tab栏,下面是swiper,,tab和swiper和 红色滑块 动态变化,, 遇到的问题: 往下滚动 tab栏 吸顶: position:sticky; z-index:99; top:0;swiper切换触发 change 事件, :current …

SOMEIP协议--第四节[ SOME/IP](someip概述与行为)

SOMEIP协议–第四节[ SOME/IP](someip概述与行为) 文章目录 SOMEIP协议--第四节[ SOME/IP](someip概述与行为)1、概述2、someip的行为2.1 基础传输2.2 SOME/IP-TP传输:2.3 someip参数(client)2.4 someip参数(server)1、概述 Method | Event | Field是上层设计的三个概念…

【C++】优先级队列和反向迭代器 模拟笔记

文章目录 优先级队列仿函数适配器模式堆知识储备 反向迭代器代码(反向迭代器)代码(优先级队列) 优先级队列 仿函数 仿函数,它不是函数(其实是个类),但用法和函数一样。既然是个类&a…

子类化QThread来实现多线程,moveToThread函数的作用

子类化QThread来实现多线程, QThread只有run函数是在新线程里的,其他所有函数都在QThread生成的线程里。正确启动线程的方法是调用QThread::start()来启动。 一、步骤 子类化 QThread;重写run,将耗时的事件放到此函数执行&#…

轻量级Web报表工具ActiveReportsJS全新发布v4.0,支持集成更多前端框架!

ActiveReportsJS 是一款基于 JavaScript 和 HTML5 的轻量级Web报表工具,采用拖拽式设计模式,不需任何服务器和组件支持,即可在 Mac、Linux 和 Windows 操作系统中,设计多种类型的报表。ActiveReportsJS 同时提供跨平台报表设计、纯…

18.背景轮播

背景轮播 html部分 <div class"container"><div class"slide active" style"background-image: url(./static/20180529205331_yhGyf.jpeg);"></div><div class"slide " style"background-image: url(./s…