现在是2019年 我也在http里问GET和POST的区别
1.前言
最近看了一些同学的人脸故事,发现不管是什么技术岗位,还是会问get和post的区别,但是我们搜出来的答案并不能让我们假装擅长,所以我们就从HTTP消息的角度来做一波,从而了解他们的区别。
2.标准答案
在开始之前,我们先来看看标准答案是什么样子的。w3school: GET vs POST。标准答案很漂亮,但是如果你在面试的时候把下面的表格扔到面试官的脸上,估计你就要被逼*了。
分类GET POST后退按钮/刷新无害数据将被重新提交(浏览器应通知用户数据将被重新提交)。书签可以作为书签收集,但不能作为书签。缓存可以被缓存。无法缓存编码类型application/x-www-form-URL encoded application/x-www-form-URL encoded或multipart/form-data。对二进制数据使用多种编码。历史参数保留在浏览器历史中。参数不会保存在浏览器历史记录中。数据长度的限制是肯定的。发送数据时,GET方法将数据添加到URL。网址的长度是有限的(网址的最大长度是2048个字符)。无限制。数据类型的限制只允许ASCII字符。没有限制。也允许二进制数据。安全性与POST相比,GET的安全性较低,因为发送的数据是URL的一部分。发送密码或其他敏感信息时千万不要使用GET!开机自检比获取更安全,因为参数不会保存在浏览器历史记录或网络服务器日志中。可见性数据对网址中的每个人都是可见的。数据不会显示在网址中。注意,并不是标准答案错了,而是以上差异在大多数浏览器中都存在,因为这些浏览器都实现了HTTP标准。但是,上面的列表只是浏览器实现的区别,并不是get和post的本质区别。
3.获取和发布消息的区别
首先总结一下,GET和POST方法没有实质性的区别,只是消息格式不同。
GET和POST只是HTTP协议中的两种请求模式,HTTP协议是基于TCP/IP的应用层协议。GET和POST都使用相同的传输层协议,因此在传输上没有区别。
在消息格式中,当没有参数时,最大的区别是第一行中的方法名称不同
POST方法请求消息的第一行是POST /uri HTTP/1.1 \r\n
GET方法请求消息的第一行是GET /uri HTTP/1.1 \r\n
是的,它们之间没有参数的区别只是消息的前几个字符
带参数的消息有什么区别?按照惯例,GET方法的参数应该放在url中,POST方法的参数应该放在正文中
例如,如果参数是name=chengqm,age=22。
GET方法消息的简化版本如下所示
GET /index.php?name=启明. cage=22 HTTP/1.1host : localhost
POST方法消息的简化版本如下所示
POST/index . PHP HTTP/1.1 host : localhostContent-type : application/x-www-form-URL encoded
名字=启明.凯奇=22
现在我们知道,这两种方法本质上都是TCP连接,没有区别,也就是说,如果我不遵循规范,我可以做到。我们可以在URL上写参数,然后方法使用POST;您也可以在Body中编写参数,然后该方法使用GET。当然,这需要服务器支持。
4.常见问题
GET方法参数的编写是固定的吗?在合同中,我们的参数是写在?在后面,和分开。
我们知道,解析一条消息的过程就是获取TCP数据,通过正则化等工具从数据中获取Header和Body,从而提取参数。
也就是说,我们可以自行约定参数的写入,只要服务器能够解释。一种流行的写作方法是http://www.example.com/user/name/chengqm/age/22.
POST方法比GET方法更安全?
根据大多数网上文章的解释,POST比GET更安全,因为数据在地址栏是看不见的。
但是从传输的角度来看,它们都是不安全的,因为HTTP在网络上是明文传输的,所以只要数据包在网络节点上被捕获,数据报文就可以完全获取。
要安全传输,只有加密,也就是HTTPS。
GET方法的长度限制是多少?
网上很多关于两者区别的文章都有这个,提到浏览器地址栏输入的参数是有限的。
首先,HTTP协议没有Body和URL的长度限制,但是URL的限制大部分是浏览器和服务器造成的。
先不说浏览器原因。服务器消耗更多的资源来处理长网址。为了性能和安全(防止恶意构建长网址进行攻击),它会限制网址的长度。
POST方法生成两个TCP包?
有文章提到,帖子会分别发送头部和正文,先发送头部,服务器会在发送正文前返回100个状态码。
HTTP协议没有明确说明POST会生成两个TCP包,实际测试(Chrome)显示不会分别发送头和体。
因此,头体分开发送是某些浏览器或框架的一种请求方式,并不是发帖的必然行为。
谈话很便宜,给我看看密码
如果对get和post消息的区别有疑问,可以直接设置一个Socket服务器,然后封装一个简单的HTTP处理方法,直接观察处理HTTP消息,一目了然
#!/usr/bin/env python #-*-coding : utf-8-*-import SocketHost,PORT=' ',23333 def server _ run(): listen _ socket=socket . socket(socket。AF_INET,插座。SOCK _ STREAM)listen _ socket . setsockopt(socket。SOL_SOCKET,SOCKET。SO_REUSEADDR,1) listen_socket.bind((HOST,Port))listen _ socket . listen(1)print('在端口% s上提供http . '% port)而true : #接受连接client_connection,client _ address=listen _ socket . accept()handle _ request(client _ connection)def handle _ request(client _ connection): #获取请求消息request=' '而true : recv _ data=client _ connection . recv(2400)recv _ data=recv _ data . decode()request=recv _ data if len(recv _ data)24003: break #解析第一行first _ line _ arraysplit(')#分离标头和正文space _ line _ index=request . index(' \ r \ N \ r \ N ')标头=request[0: space _ line _ index]正文=request[space _ line _ index 43360]#打印请求消息print(request) #返回消息http _ response=b ' ' \ http/1.1 200 ok!你好,世界!/title/head dyp style=' color : green ' hello,World!/p/body/html ' ' ' client _ connection . sendall(http _ response)client _ connection . close()if _ _ name _ _=' _ _ main _ ' : server _ run())上面的代码就是简单地打印一条请求消息,然后返回到HelloWorld的HTML页面,我们就运行它。
[[email protected]shell]# python HTTP server . py在端口23333上提供HTTP服务.
然后要求从浏览器中查看
打印信息
然后我们可以手动证明上面的说法,比如测试报头和正文是否分开传输,因为代码不返回100状态码,如果我们的post请求成功,就意味着它们是一起传输的(Chrome/postman)。
例如,w3school说URL的最大长度是2048个字符,所以我们添加了一个代码来计算uri的长度
.#解析第一行first _ line _ array=request。拆分(' \ r \ n') [0]。拆分(')打印(' uri长度3360% s ' % len(first _ line _ array[1])).
让我们使用邮递员直接发送超过2048个字符的请求
那么我们就可以得出结论,url长度限制是受到一些浏览器和服务器的限制,与HTTP协议无关。
此时,我们可以愉快地假装用力:)
参考:
99%的人误解了HTTP中GET和POST的区别。关于HTTP GET和POST w3school: HTTP方法:比较GET和POST wikipedia:超文本传输协议RFC 2068。本文是关于http中GET和POST的区别。请阅读我们以前的文章。
版权声明:现在是2019年 我也在http里问GET和POST的区别是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。