HTTP 协议中 GET 和 POST 方法详解
GET请求报文分析
1、请求行
请求方法
GET(描述该请求采用了什么请求方法),HTTP 1.0 和 1.1 协议中共包含10种请求方法。不过 HTTP 1.1 中只有8种方法。
URI
请求WEB服务器的资源名称。
URI:统一资源标识符(代表这个资源的名称),如:上图中的 /PrjTheHttpProtocol/test?username=admin&userpassword=123
说明:HTTP协议规定GET请求发送数据在URI中发送,格式:uri?name=value&name=value&name=value…..
URL:统一资源定位符(不但代表这个资源的名称,而且通过它还可以找到该资源),如:http://ip:port/URI
协议版本
HTTP 1.1(当前使用的HTTP协议版本)
2、请求报头
告诉web服务器浏览器接收的语言版本。
请求web服务器的IP地址和端口号。
Cookies等信息。
3、空白行
分割请求报头和请求体的专用行。
4、请求体
由于当前使用的请求方式是GET请求方式,所以请求体中不传送任何数据。
POST请求报文分析
1、 请求行
与GET方法一样,请求行也包括请求方法、URI、协议版本。
不同的是采用POST方式发送请求,URI后边没有任何数据。
2、 请求报头
由于请求是POST请求,所以报头中显示:Cache-Control:no-cache
3、 空白行
分割请求报头和请求体的专用行。
4、 请求体
由于当前使用的请求方式是POST请求方式,所以数据在请求体中发送,并且默认格式是:name=value&name=value&name=value……
当然,可以通过在请求报头里指定 Content-Type 来指定为其他格式。
响应报文分析
1、 状态行
协议版本
HTTP 1.1:HTTP协议版本号
状态码
200:响应状态号
OK:对响应结果的描述
2、 响应报头
WEB服务器版本信息
内容类型以及字符编码方式
内容长度,响应回来的总字符数
响应时间
Cookies等信息
3、 空白行
分割响应报头和响应体的专用行。
4、 响应体
响应正文
GET和POST的区别
1、 一次HTTP请求中 POST 两次发包,GET 一次发包。
多数浏览器对于POST采用两阶段发送数据的,先发送请求头,再发送请求体,即使参数再少再短,也会被分成两个步骤来发送(相对于GET),也就是第一步发送 head 数据,第二步再发送 body 部分。HTTP 是应用层的协议,而在传输层有些情况 TCP 会出现两次连结的过程,HTTP 协议本身不保存状态信息,一次请求一次响应。对于 TCP 而言,通信次数越多可靠性越低,能在一次连结中传输完需要的消息是最可靠的,尽量使用 GET 请求来减少网络耗时。如果通信时间增加,这段时间客户端与服务器端一直保持连接状态,在服务器侧负载可能会增加,可靠性会下降。
2、GET请求的结果能够被缓存,POST的请求结果不进行缓存。
GET 请求返回结果能够被保存在浏览器的浏览历史里面,如果密码等重要数据使用 GET 提交,别人查看历史记录,就可以直接看到这些私密数据。
3、GET请求和POST请求的参数携带位置不同。
GET请求通过URL(请求行)提交数据,在URL中可以看到所传参数。POST通过“请求体”传递数据,参数不会在URL中显示 。
4、GET请求提交的数据一般都有长度限制,POST请求一般没有限制。
(1)GET方法提交的数据大小长度并没有限制,HTTP协议规范没有对URL长度进行限制。这个限制是特定的浏览器及服务器对它的限制。下面就是对各种浏览器和服务器的最大处理能力做一些说明。
浏览器/服务器 | 说明 |
---|---|
Microsoft Internet Explorer(IE) | URL最大长度限制为2083个字符,如果超过这个数字,提交按钮没有任何反应。 |
FireFox | URL最大长度限制为65,536个字符 |
Safari | URL最大长度限制为 80,000个字符 |
Opera | URL最大长度限制为190,000个字符 |
Google Chrome | URL最大长度限制为8182个字符 |
Apache Server | 服务器,能接受最大URL长度为8,192个字符 |
Microsoft Internet Information Server(IIS) |
服务器,能接受最大URL长度为16,384个字符 |
通过上面的数据可知,为了让所有的用户都能正常浏览, URL最好不要超过IE的最大长度限制(2083个字符),当然,如果URL不直接提供给用户(浏览器),而是提供给程序调用,这时的长度就只受Web服务器影响了。
注意:对于中文的传递,最终会为urlencode后的编码形式进行传递,如果浏览器的编码为UTF8的话,一个汉字最终编码后的字符长度为9个字符。
(2)理论上讲,POST是没有大小限制的。HTTP协议规范也没有进行大小限制,起限制作用的是服务器的处理程序的处理能力。
如:在Tomcat下取消POST大小的限制(Tomcat默认2M)。打开 Tomcat 目录下的 conf 目录,打开server.xml 文件,增加 maxPostSize="0"(设为0是取消POST的大小限制)
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
maxPostSize="0" />
GET和POST使用上的一些问题
对于HTTP协议下的GET请求参数长度是有大小限制的,最大不能超过XX,而 POST 是无限制?
(1)首先即使有长度限制,也是限制的是整个 URI 长度,而不仅仅是你的参数值数据长度。
(2)HTTP 协议从未规定 GET/POST 的请求长度限制是多少。
(3)所谓的请求长度限制是由浏览器和 Web 服务器决定和设置的,各种浏览器和 Web 服务器的设定均不一样,这依赖于各个浏览器厂家的规定或者可以根据 Web 服务器的处理能力来设定。
HTTP请求的两种方式,GET和POST请求的本质上的区别:
HTTP协议是这样解释GET和POST的:GET请求不应该做读取数据之外的事情。而如果一个请求,修改了服务器资源或者使用了服务器资源(如发邮件,使用打印机等),那么应当使用POST。所以,GET和POST的本质区别是使用场景的区别,简单的说,GET是只读,POST是写。浏览器对两种请求的不同处理方式也是基于这两个不同的场景:
GET:查询往往需要的上传的数据量比较小,查询参数也往往不需要保密,所以放在URL里比较高效。HTTP协议要求同一URL的多个请求应该返回同样的结果,所以浏览器可以把返回结果缓存起来,以提高性能。至于参数长度的限制,这个是和浏览器URL的长度限制相关的,1024也好,2048也好,其实没有太大的意义,参数超长往往是错误使用GET方法的结果。
POST:修改数据需要支持大数据量表单的提交,数据也常常包含用户的私人信息,所以数据放在请求的消息体中传递。相同的POST请求可能会对服务器端产生不同的影响,比如两次POST可能创建两条不同的数据,所以对POST返回结果的缓存是没有意义的。
如何判断当前请求是GET请求还是POST请求?
(1)在浏览器地址栏上直接编写URL提交的请求一定是GET请求。
(2)使用热链接向服务器发送的请求一定是GET请求。
(3)使用form表单提交数据的时候,如果method属性没有编写,或者method属性值被指定是GET,这样发送的请求属于GET请求。
(4)使用form表单提交数据的时候,如果method属性值被手动指定为POST,那么该请求属于POST请求。
用GET,还是用POST?
如果回答“因为POST的参数长度不受限制,所以我用POST,就有点本末倒置了。两者之间如何选择,首先要看是不是修改或者使用了服务器资源,其次要看请求或者响应中的数据是不是包含了敏感信息,如果是,那么应该选择POST,同时处于安全性的考虑,服务器端应该只接受POST,拒绝GET。比如数据的增加和修改,认证信息的提交,是一定要用POST的。如果只是简单查询,用GET就可以了。
POST请求是不是比GET请求更安全?
有人说“POST比GET安全,因为GET的参数都明文写在URL上了”,从个人信息安全的角度上说,这句话是对的,但这种安全机制是“防君子不防小人”的,有各种工具能够获取POST请求的数据。如前面所说,两者有截然不同的使用场景,如果是该用POST的地方用了GET,又说GET不安全,那GET也太冤枉了。其实,HTTP协议中提到GET是安全的方法(safe method),其意思是说GET方法不会改变服务器端数据,所以不会产生副作用。这是建立在Web开发人员正确使用GET方法的基础上的,如果修改数据的请求却使用了GET方法,显然是非常危险的。
GET与POST的误用有什么危害?
应该使用GET的地方用了POST:性能受损,浏览器不会缓存。
应该使用POST的地方用了GET:每一个这样的地方都是一个漏洞,有可能被黑客利用。如果是一个对安全要求很高的网站,一定不要忽视。
不仅仅是在前端要正确的使用GET和POST,同时还需要后端代码的支持,比如后端应当在需要POST请求的时候拒绝GET请求,从而切断黑客利用GET请求攻击的途径,更高级别的,还需要对POST请求进行过滤,以确保所有的POST请求都来自可信任的地址。
HTTP 协议中 GET 和 POST 方法详解的更多相关文章
- python中requests库使用方法详解
目录 python中requests库使用方法详解 官方文档 什么是Requests 安装Requests库 基本的GET请求 带参数的GET请求 解析json 添加headers 基本POST请求 ...
- php_DWZ-JUI中碰到的问题解决方法详解(thinkphp+dwz)
原文:php_DWZ-JUI中碰到的问题解决方法详解(thinkphp+dwz) 折腾了两天,dwz删除后,数据不能自动刷新,解决方案,直接看图 . 1. 删除.修改状态后无法刷新记录: 在dwz. ...
- PHP 中 16 个魔术方法详解
PHP 中 16 个魔术方法详解 前言 PHP中把以两个下划线__开头的方法称为魔术方法(Magic methods),这些方法在PHP中充当了举足轻重的作用. 魔术方法包括: __constru ...
- 并发编程(六)Object类中线程相关的方法详解
一.notify() 作用:唤醒一个正在等待该线程的锁的线程 PS : 唤醒的线程不会立即执行,它会与其他线程一起,争夺资源 /** * Object类的notify()和notifyAll()方法详 ...
- iOS 判断数组array中是否包含元素a,取出a在array中的下标+数组方法详解
目前找到来4个解决办法,第三个尤为简单方便 NSArray * arr = @["]; //是否包含 "]) { NSInteger index = [arr indexOfObj ...
- [51单片机] Keil C51中变量的使用方法详解
引言 8051内核单片机是一种通用单片机,在国内占有较大的市场份额.在将C语言用于51内核单片机的研究方面,Keil公司做得最为成功.由于51内核单片机的存储结构的特殊性,Keil C51中变量 ...
- Java中 hashCode()方法详解
先来看下Object源码里hashcode方法: /** * Returns a hash code value for the object. This method is * s ...
- 方法object面试题分析:7JAVA中Object的clone方法详解-克隆-深克隆
时间紧张,先记一笔,后续优化与完善. 每日一道理 翻开早已发黄的页张,试着寻找过去所留下的点点滴滴的足迹.多年前的好友似乎现在看来已变得陌生,匆忙之间,让这维持了多年的友谊变淡,找不出什么亲切 ...
- java 中toString()方法详解
1.toString()方法 Object类具有一个toString()方法,你创建的每个类都会继承该方法.它返回对象的一个String表示,并且对于调试非常有帮助.然而对于默认的toString() ...
随机推荐
- MySQL加入log_bin报错
MySQL中二进制日志功能默认是关闭的,查看各种开启方式后,确定在配置文件中加入如下配置来开启该功能: [root@bogon /]# more /etc/my.cnf [mysqld] datadi ...
- Python爬虫——Request模块
# 使用 Requests 发送网络请求# 1.导入 Requests 模块import requests# 2.尝试获取某个网页 # HTTP 请求类型r = requests.get('https ...
- 关于js中操作数组的一些方法
网上找的通篇看了一遍讲的很透收藏了! 转自(https://www.cnblogs.com/blogs-8888/p/6518683.html) 1.锁定数组的长度(让数组的长度变成只读). 1 2 ...
- gcc8.2安装__(沒有成功)
重要:https://gcc.gnu.org/install/prerequisites.html 官方安装所需要的工具文档 还有就是这篇文章 http://blog.51cto.com/2716 ...
- 记录在Ubuntu 18.04系统中安装Apache, MySQL和PHP环境
虽然我们在Linux VPS.服务器安装WEB环境比较方便,可以选择面板或者一键包,但是有些我们需要深入学习的网友不会选择一键安装,而是会尝试编译安装.这样可以学到一些内在的技术.一般我们较为习惯选择 ...
- springcolud文章收藏
https://blog.csdn.net/dyc87112/column/info/14412https://blog.csdn.net/dyc87112/article/details/79357 ...
- 博客六--Tensorflow卷积神经网络的自主搭建
本人较懒也很忙,所以就不重复工作.连接我的开源中国博客查询:https://my.oschina.net/u/3770644/blog/3042523
- oo第12次作业
一.规格化设计发展历史 在上世纪60年代,由于程序猿们难以忍受超级难懂的机器语言和稍微好懂一点点的汇编语言,便发明了结构化的程序语言,使得程序猿们能愉快地编写复杂程度适中的程序.但是需求是在不断增长的 ...
- nginx 配置文件学习
######Nginx配置文件nginx.conf中文详解##### #定义Nginx运行的用户和用户组 user www www; #nginx进程数,建议设置为等于CPU总核心数. worker_ ...
- python 练习2
购物订单系统: #!usr/bin/env python # encoding: utf-8 import sys i = 0 inventory_dic = {'Car':1000,'SUV':50 ...