HTTP中的GET和POST方法详解

2023-05-16

一般来说GET是获取数据,POST是提交数据的。但是因为GET和POST都是HTTP的方法,HTTP又是基于TCP/IP的关于数据在万维网中如何让通讯的协议。从本质上讲,GET和POST都是HTTP请求,都是TCP链接,是无区别的。

但是HTTP协议既然有了这两个方法,就是为了在特定的情况下区分应用。

1、GET是获取数据,POST是提交数据的。
GET方法通常用于请求服务器发送某个资源,而且应该是安全的和幂等的。
仅仅是获取资源信息,就像数据库查询一样,不会修改和增加数据,不会影响资源的状态。

POST方法向服务器提交数据,将数据提交给服务器处理。POST是向服务器传输数据,数据会被重新提交,所以就会有对原有的数据造成伤害。向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。

安全的和幂等的。所谓安全的意味着该操作用于获取信息而非修改信息。幂等的意味着对同一个 URL 的多个请求应该返回同样的结果。完整的定义并不像看起来那样严格。换句话说,GET 请求一般不应产生副作用。从根本上讲,其目标是当用户打开一个链接时,可以确信从自身的角度来看没有改变资源。比如,新闻站点的头版不断更新。虽然第二次请求会返回不同的一批新闻,该操作仍然被认为是安全的和幂等的,因为它总是返回当前的新闻。反之亦然。POST 请求就不那么轻松了。POST 表示可能改变服务器上的资源的请求。仍然以新闻站点为例,读者对文章的点赞应该通过 POST 请求实现,因为在点赞提交之后站点已经不同了,点赞数增多了。

2、考虑参数的位置:GET请求的参数位于url中,而POST请求的参数位于request body中。
这导致了三个问题,
一是GET请求的安全性不如POST请求;
二是GET的参数有长度限制,而POST没有;
三是GET的参数只允许ASCII字符,POST没有限制。

GET方式在通过URL提交数据,数据在URL中可以看到;POST方式,数据放置在Request Body内提交。使用 GET的时候,参数会显示在地址栏上,而 POST不会。所以,如果这些数据是中文数据而且是非敏感数据,那么使用 GET;如果用户输入的数据不是中文字符而且包含敏感数据,那么还是使用 POST为好。

HTTP协议并没有对GET和POST的长度做限制,GET的最大长度限制是因为浏览器和web服务器限制了URL的长度
URL地址是有长度限制的(GET方式在通过URL提交数据),浏览器不同长度限制的具体数值也是不一样的。比如IE是2083字节。需要注意的是这些仅仅是URL地址栏的长度限制。
理论上来说POST的长度是没有限制的(POST方式,数据放置在Request body内提交),但是受服务器的配置限制或者内存大小的限制,造成了实际开发中POST也是有数据长度的限制的。

3、为什么GET比POST更快
1.POST请求包含更多的请求头
因为POST需要在请求的body部分包含数据,所以会多了几个数据描述部分的首部字段(如:content-type),这其实是微乎其微的。

2.最重要的一条,POST在真正接收数据之前会先将请求头发送给服务器进行确认,然后才真正发送数据
POST请求的过程:
(1)浏览器请求tcp连接(第一次握手)
(2)服务器答应进行tcp连接(第二次握手)
(3)浏览器确认,并发送post请求头(第三次握手)
(4)服务器返回100 Continue响应
(5)浏览器发送数据

(6)服务器返回200 OK响应
GET请求的过程:
(1)浏览器请求tcp连接(第一次握手)
(2)服务器答应进行tcp连接(第二次握手)
(3)浏览器确认,并发送get请求头和数据(第三次握手)
(4)服务器返回200 OK响应

因为POST需要两步,时间上消耗的要多一点,看起来GET比POST更有效。因此Yahoo团队有推荐用GET替换POST来优化网站性能。但这是一个坑!跳入需谨慎。为什么?

1) GET与POST都有自己的语义,不能随便混用。
2) 据研究,在网络环境好的情况下,发一次包的时间和发两次包的时间差别基本可以无视。而在网络环境差的情况下,两次包的TCP在验证数据包完整性上,有非常大的优点。
3)并不是所有浏览器都会在POST中发送两次包,Firefox就只发送一次。

3.GET会将数据缓存起来,而POST不会 (GET在浏览器回退时是无害的,而POST会再次提交请求。GET会将请求参数放在请求的url中,回退操作实际上浏览器会从之前的缓存中拿结果;POST每次调用都会创建新的资源。)

可以做个简短的测试,使用ajax采用GET方式请求静态数据(比如html页面,图片)的时候,如果两次传输的数据相同,第二次以后消耗的时间将会在10ms以内(chrome测试),而POST每次消耗的时间都差不多。经测试,chrome和firefox下如果检测到GET请求的是静态资源,则会缓存,如果是数据,则不会缓存,但是IE什么都会缓存起来。

4.POST不能进行管道化传输
使用浏览器浏览一个包含多张图片的 HTML 页面时,在发送请求访问 HTML 页面资源的同时,也会请求该 HTML 页面里包含的其他资源。因此,每次的请求都会造成无谓的 TCP 连接建立和断开,增加通信量的开销。为解决上述 TCP 连接的问题,HTTP/1.1 和一部分的 HTTP/1.0 想出了持久连接(HTTP Persistent Connections,也称为 HTTP keep-alive 或HTTP connection reuse)的方法。持久连接的特点是,只要任意一端没有明确提出断开连接,则保持 TCP 连接状态。
持久连接使得多数请求以管线化(pipelining)方式发送成为可能。从前发送请求后需等待并收到响应,才能发送下一个请求。管线化技术出现后,不用等待响应亦可直接发送下一个请求。

但是这样的方式有一个问题:不安全,如果一个管道中有10个连接,在发送出9个后,突然服务器告诉你,连接关闭了,此时客户端即使收到了前9个请求的答复,也会将这9个请求的内容清空,也就是说,白忙活了……此时,客户端的这9个请求需要重新发送。这对于幂等请求还好(比如GET,多发送几次都没关系,每次都是相同的结果),如果是POST这样的非幂等请求,肯定是行不通的。
所以,POST请求不能通过管道的方式进行通信!很有可能,POST请求需要重新建立连接,这个过程不跟完全没优化的时候一样了么?所以,在可以使用GET请求通信的时候,不要使用POST请求,这样用户体验会更好,当然,如果有安全性要求的话,POST会更好。管道化传输在浏览器端的实现还需考证,貌似默认情况下大部分浏览器(除了opera)是不进行管道化传输的,除非手动开启!
总结:

GETPOST
参数位置url中Request Body中
参数长度有限制无限制
参数编码ASCII编码无限制
后退/刷新不重复提交,回退无害重复提交,回退有害
安全性参数暴露,不安全安全
缓存可以缓存不可以缓存
书签可以收藏为书签不可以收藏为书签
历史参数保存在浏览器历史不保存在浏览器历史
请求包个数1个 http header+data2个 先 http header ,再data

根据这个总结你可以大胆放心的展开说了!

参考了很多博客还有自己理解添加整理,希望过些日子如果面试被问到会有帮助,也希望看到这篇博客的人天天开心。欢迎指正。

参考链接 :http://www.blogjava.net/honeybee/articles/164008.html
https://zhuanlan.zhihu.com/p/22536382
https://blog.csdn.net/cuiwkong/article/details/90312283
https://blog.csdn.net/zzk220106/article/details/78595108/

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

HTTP中的GET和POST方法详解 的相关文章

  • ASP.NET Core URL 重写

    我正在尝试将我的网站从 www 重定向到非 www 规则以及 http 到 https https example com https example com 在中间件中 我曾经在 web config 中进行这些重定向更改 例如
  • ASP.NET 中 HTTP 缓存相关标头的有效含义

    我正在 ASP NET 2 0 中开发一个 Web 应用程序 其中涉及通过资源处理程序 ashx 提供图像 我刚刚实现了处理缓存标头和条件 GET 请求 这样我就不必为每个请求提供所有图像 但我不确定我是否完全理解浏览器缓存发生了什么 图像
  • Android - API 请求

    我开发了一个应用程序 它也在 iPhone 上 问题出在 api 请求上 我为所有请求设置了超时 有时会出现 30 60 秒的中断 看起来这个应用程序执行了几个请求 然后就中断了 一直超时 大约 45 秒后一切正常 不知道是服务器问题还是安
  • Jquery POST 获取建议列表

    我有下一个代码 它运行良好 问题是当用户写完单词时 脚本不断创建后调用并不断更改建议列表 我想做一些事情 如果用户继续写一个单词 脚本会停止所有的 post 调用 只执行最后一个 inputString keydown function l
  • 404 标头 - HTTP 1.0 还是 1.1?

    为什么我能找到的几乎每个例子 包括这个问题 https stackoverflow com questions 437256 sending a 404 error in php大约一年前 说 404 标头应该是HTTP 1 0 404 N
  • MS Access 执行 POST Web 请求

    在我的 MS Access 应用程序中 我需要定期向我的网络服务器发送一批信息 我不需要任何花哨的东西 比如 SOAP XML RPC 或任何东西 只需一个简单的 POST 页面请求就足够了 我用谷歌搜索了一下 但找不到任何真正有用的东西
  • iOS NSURLSession,如何在didCompleteWithError中重试

    我想在我的服务器上尝试一次调用 直到成功为止 我想每 30 秒尝试一次 所以我使用 NSURLSession 进行通话 NSURLSessionDownloadTask task self session downloadTaskWithR
  • 如何在flutter项目中使用http拦截器?

    我必须向我的所有 Api 添加标头 有人告诉我为此使用 http 拦截器 但我无法理解如何做到这一点 因为我是颤振的新手 谁能帮我举个例子吗 您可以使用http 拦截器 https pub dev packages http interce
  • HTTP Header Key 可以重复吗?

    在 JAVA HttpUrlConnection 中 请求 Header 设置的主要逻辑代码如下 public synchronized void set String k String v for int i nkeys i gt 0 i
  • 用 C++ 解析 HTTP 标头

    我正在使用curl 与服务器通信 当我发出数据请求时 我收到 HTTP 标头 后跟由边界分隔的 jpeg 数据 如下所示 我需要解析出 边界字符串 内容长度 我已将传入数据复制到 char 数组 如下所示 static size t OnR
  • 使用python将json和文件发送到flask

    我遇到这个问题 我试图在单个函数中向 Flask API 发送 接收一些文件和 JSON 在我的客户端 发件人 上我有 my json to be sent datas var1 var1 var2 var2 my file to be s
  • 使用 WCF 支持“application/x-www-form-urlencoded”发布数据的最佳方式?

    我正在基于 W3C 规范构建 WCF 服务 该规范定义了接受 application x www form urlencoded 发布数据的 RESTful Web 服务端点 默认情况下 WCF 不支持这种类型的消息编码 我发现了许多创建如
  • 注册期间现有电子邮件的 422 或 409 状态代码

    我正在构建 RESTful API 遇到了一种情况 在用户注册期间 如果电子邮件已存在 则在422 and 409哪个http响应代码有意义 我浏览过类似的one https stackoverflow com questions 9269
  • 自定义 HTTP 标头:命名约定

    我们的一些用户要求我们将与其帐户相关的数据包含在HTTP 标头我们向他们发送的请求 甚至是他们从我们的 API 获得的响应 添加自定义 HTTP 标头的一般约定是什么 naming format etc 另外 请随意发布您在网络上偶然发现的
  • Apache 未发送 304 响应(如果启用了 mod_deflate 和 AddOutputFilterByType)

    我在 Apache httpd conf 中添加了以下行 AddOutputFilterByType DEFLATE text html text css application javascript application x javas
  • android httprequest java.net.UnknownHostException

    我想用android发出http请求 是使用这个 void testHTTP HttpClient httpClient new DefaultHttpClient HttpUriRequest request new HttpPost h
  • 我可以从 HTTP 请求中找到无线接入点的 BSSID(MAC 地址)吗?

    假设有人在咖啡店里无线连接到互联网 并向 johnsveryownserver com 发送 HTTP 请求 服务器端 有什么方法可以确定我的MAC地址吗 无线接入点他们连接到什么 请注意 我对他们机器的 MAC 地址不感兴趣 如果我无法使
  • 尝试克隆一个 git 存储库,但它卡在克隆到中

    我使用的是 Windows 10版本 10 0 19042 内部版本 19042 GIT Ver 2 32当尝试使用 git bash 执行以下命令时git clone depth 1 b carla https github com Ca
  • 如何设置响应文件名而不强制“另存为”对话框

    我在某些响应中返回一个流 设置适当的content type标头 我正在寻找的行为是这样的 如果浏览器能够呈现给定内容类型的内容 那么它应该将其显示在浏览器窗口中 如果浏览器不知道如何呈现内容 那么它应该显示 另存为 对话框 其中文件名应该
  • 以 REST 方式更新整个资源集合

    我有一个资源列表的 REST URI 例如 http foo com group users 这些用户中的每一个都有一个序列号 我想公开一种方法来为集合中的所有用户重新编号这些值 并使访问该列表的每个人都可以使用此更改 由于这是对整个集合的

随机推荐

  • C语言入门篇——文件操作篇

    目录 1 为什么使用文件 2 什么是文件 2 1程序文件 2 2数据文件 2 3文件名 3 文件的打开和关闭 3 1文件指针 3 2文件的打开和关闭 4 文件的顺序读写 5 文件的随机读写 5 1fseek 5 2ftell 5 3rewi
  • 【C】模拟实现strlen,strcpy,strcat,strcmp,strncpy,syrcat,strnact,strncmp,strstr等字符串函数

    目录 字符串函数模拟实现 1 strlen模拟实现 2 strcpy模拟实现 3 strncpy模拟实现 4 strcat模拟实现 5 strncat模拟实现 6 strcmp模拟实现 7 strncmp模拟实现 8 strstr模拟实现
  • 【C】模拟实现memcpy,memmove内存函数

    目录 内存函数模拟实现 1 memcpy模拟实现 2 memmove模拟实现 3 测试案例代码 内存函数模拟实现 C 库函数 memcpy 从存储区 str2 复制 n 个字节到存储区 str1 这个函数在遇到 39 0 39 的时候并不会
  • 【C】模拟实现atoi,atof函数

    目录 atoi函数 atof函数 模拟实现atoi xff0c atof函数 1 atoi模拟实现 2 atof模拟实现 3 测试案例代码 atoi函数 atoi函数是将字符串转换成整数 函数头文件 xff1a include lt std
  • 英伟达JETSON XAVIER NX使用小记

    1 输入法问题 安装谷歌拼音 xff08 支持ARM64位系统 xff09 系统设置 gt 语言支持 gt 键盘输入法系统 gt 选择 fcitx gt 关闭 在终端中进行安装和部分卸载工作 xff1a sudo apt get insta
  • Spark | Stage进度条展示(showConsoleProgress)

    spark version 61 2 4 4 在执行Spark任务中 xff0c 经常会看到以下类似的Stage进度日志信息 xff0c 如下 xff1a Stage 0 gt 0 43 0 1753 Stage 0 gt 0 43 65
  • Ubuntu 安装odoo10 环境搭建

    安装时 xff0c 默认用户名为 odoo ubuntu 16开始 使用 systemd 管理服务 xff0c 但是systemd 兼容 sysv init 脚本 下载 odoo源码 从 http nightly odoo com 10 0
  • 无人机自动悬停的秘密

    无人机自动悬停的秘密 http www icpcw com Information Tech News 3244 324449 all htm 正文我来说两句 已有0 人参与 2014 11 11 10 36 18类型 xff1a 原创来源
  • ubuntu终端输入命令启动chrom浏览器

    文章目录 一 阻塞式打开 一 阻塞式打开 打开一个空白网页 google chrome 浏览指定网址 google chrome www baidu com google chrome https blog csdn net sandalp
  • C++之vector与指针

    文章目录 一 指向vector的指针1 amp xff1a 指向栈上的vector xff08 1 xff09 形式 xff08 2 xff09 局部变量自动释放 xff08 3 xff09 区分误区 2 new xff1a 指向堆上的ve
  • 《ROS机器人开发实践》第6.2.4节“在rviz中显示模型”问题总结

    输入 roslaunch mbot description display mbot base urdf launch后 xff0c 出现以下错误 解决方法 xff1a 在终端输入 source catkin ws devel setup
  • FreeRTOS堆栈溢出检查

    FreeRTOS堆栈溢出检查 RTOS任务都需要分配堆栈 xff0c 堆栈大小不合理 xff0c 会造成内存越界或者资源的浪费 如果在没有把握堆栈大小 xff0c 尽量将堆栈往大的方向设置 xff0c 这样能保证任务堆栈上下文切换不会溢出
  • PTZ云台开发过程中PELCO-D、PELCO-P协议遇到的问题

    最近学习了云台的一些东西 xff0c 比如云台的协议阿 xff0c 云台的调试什么 xff0c 通过这段时间努力终于把几个问题解决了 xff0c 一个是对于某个厂商 A 的云台出现的 pelco p 协议在波特率 2400 xff0c 48
  • apt-get 源和常识

    本文内容 xff1a 1 apt get的源换成阿里或163的 2 atp get的源的常识 一 概述 安装好Ubuntu它自带源是国外的 xff0c 访问较慢 xff0c 经常会出现连接失败的情况 所以建议将它替换为国内的 xff08 如
  • ROS安装rosdep update出现ERROR: unable to process source

    sudo gedit etc hosts 在最下面添加一句这个 xff1a 151 101 84 133 raw githubusercontent com sudo mkdir p etc ros rosdep sources list
  • 基于NavMesh寻路、漏斗寻路、RVO动态避障自创的服务器大规模寻路+动态避障算法的实现

    一 描述 TW项目是一个拥有较广阔野外空间的SLG游戏 xff0c 玩家的军队方阵可以在野外进行长距离行军 短距离自由行军 占领要塞 驻扎 形成战斗阵型战斗等行为 其中 xff0c 野外的山脉 河流等会产生静态阻挡 xff1b 而由玩家迁城
  • Python 日期的 加减 操作

    获取当前时间 coding 61 utf 8 import datetime now 61 datetime datetime now print now 日期输出格式化 所有日期 时间的api都在datetime模块内 datetime
  • 基于A*和势场寻路的快速小队伍动态势场避障寻路

    前言 先把本算法的适用场景和优缺点写在前面 xff0c 需要的可以继续看 xff0c 不适用的就可以直接略过了 然后在循序渐进介绍本算法 演示效果在最后 本算法适用场景 每次寻路以小队伍为单位 xff08 几个至几十个队员 xff09 队员
  • STM32 keil5 报错:flash download failed-cortex M3解决方法

    起因 因为之前自己使用的STM32都是使用的F4 xff0c 自己打了一块STM32F1C8T6板子 xff0c 焊好之后 xff0c 打开以前正点原子的例程的时候 xff0c 出现无法烧录的情况 xff0c 总是报这样的错误 xff0c
  • HTTP中的GET和POST方法详解

    一般来说GET是获取数据 xff0c POST是提交数据的 但是因为GET和POST都是HTTP的方法 xff0c HTTP又是基于TCP IP的关于数据在万维网中如何让通讯的协议 从本质上讲 xff0c GET和POST都是HTTP请求