请求方式get和post的区别,html中get和post的区别
get和post的区别1前言最近看了一些同学的面书,发现不管什么技术岗位,他们还是会问GET和POST的区别,搜到的答案也不能让我们假装很擅长。让我们从HTTP消息的角度来看一下,了解它们的区别。
2标准答案分类GETPOST返回按钮/刷新无害数据会重新提交(浏览器要通知用户数据会重新提交)。书签可以收藏为书签,不能收藏为书签。缓存可以被缓存。无法缓存编码类型application/x-www-form-urlencoded application/x-www-form-urlencoded或multipart/form-data。对二进制数据使用多重编码。历史参数保留在浏览器历史中。参数不会保存在浏览器历史记录中。数据长度的限制。是的。发送数据时,GET方法将数据添加到URL中;URL的长度有限(URL的最大长度为2048个字符)。没有限制。对数据类型的限制只允许ASCII字符。没有限制。也允许二进制数据。与secure POST相比,GET的安全性较差,因为发送的数据是URL的一部分。发送密码或其他敏感信息时,千万不要使用GET!它比POST GET更安全,因为参数不会保存在浏览器历史记录或web服务器日志中。URL中的每个人都可以看到可见性数据。数据不会显示在URL中。注意,并不是说标准答案是错的。上述差异存在于大多数浏览器中,因为这些浏览器实现了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=qiming.c,age=22。
GET方法缩略版消息如下
GET /index.php?名=清明。cage=22 http/1.1 host:localhost方法的简化消息如下
post/index . PHP http/1.1 host:localhost content-type:application/x-www-form-urlencoded name=qiming . cage=22现在我们知道两种方法本质上都是TCP连接,没有区别。也就是说,我不按规范来也是可以的。我们可以在URL上写参数,然后方法用POST;也可以在主体中写参数,然后方法使用GET。当然,这需要服务器端的支持。
4.常见问题解答GET 方法参数写法是固定的吗?
在协议中,我们的参数是写在?后来,使用分段。
我们知道,解析一条消息的过程是获取TCP数据,利用正则化等工具提取参数,从数据中获取头和体。
也就是说,我们可以自己约定参数的编写方法,只要服务器能说明就行。一种流行的写作方法是http://www.example.com/user/name/chengqm/age/22.
POST 方法比 GET 方法安全?
按照大部分网上文章的解释,POST比GET更安全,因为地址栏里看不到数据。
但从传输的角度来看,都是不安全的,因为HTTP在网络上是明文传输的,只要在网络节点上抓包,完全可以获取数据报文。
为了安全传输,只需要加密,即HTTPS。
GET 方法的长度限制是怎么回事?
网上很多关于两者区别的文章都有这篇文章,里面提到浏览器地址栏输入的参数是有限制的。
首先,HTTP协议中没有正文和URL的长度限制,对URL的限制大多是浏览器和服务器造成的。
浏览器的原因我就不说了。服务器处理长URL会消耗更多的资源,为了性能和安全(防止恶意构造长URL来攻击),会对URL长度进行限制。
POST 方法会产生两个TCP数据包?
就像有些文章提到的,post会分开发送头和正文。首先发送头部,服务器在发送主体之前返回状态码100。
HTTP协议中没有明确声明POST会生成两个TCP包,实际测试(Chrome)显示头和体不会分开发送。
所以分别发送header和body是一些浏览器或者框架的请求方式,并不是post的必然行为。
5 talk is cheap show me the code
如果对get和post消息的区别有疑问,直接启动一个Socket服务器,然后封装一个简单的HTTP处理方法,直接观察和处理HTTP消息,这样就一目了然了。
#!/usr/过时的鸡翅/env python #-*-编码:UTF-8-*-导入套接字主机,port= ,23333 def server _ run():listen _ socket=socket . socket(socket . af _ inet,socket . sock _ stream)listen _ socket . setsock opt(socket . sol _ socket,socket.so _ reusaddr,1) listen _ socket。过时的鸡翅d((HOST,Port))listen _ socket . listen(1)print(在端口% s上提供http . % port)而true:# accept connection client _ connection,client _ address=listen _ socket . accept()handle _ request(client _ connection)def handle _ request(client _ connection):# Get请求消息request= 而true:recv _ data=recv _ data . decode()request=recv _ data iflen(recv _ data)2400:break # parse第一行first _ line _ array=request . split( \ r \ n )[0]。split()#从body space _ line _ index=request . index( \ r \ N \ r \ N )header=request[0:space _ line _ index]body=request[space _ line _ index 4:]# print请求消息print(request) #返回消息http _ response=b \ http/1.1 200 ok!DOCTYPE htmlhtmlhead titleHello,World!/title/head body p style= color:green 你好,世界!/p/body/html client _ connection . sendall(http _ response)client _ connection . close()if _ _ name _= _ _ main _ :server _ run()上面的代码只是打印请求消息,然后返回到HelloWorld的HTML页面。我们经营它。
[root @ cheng qmshell]# python http server . py serving http on port 23333.然后请求从浏览器中查看。
印刷信息
然后你可以手动证明上面的说法,比如测试头和体是否分开传输。由于代码不返回100状态码,如果我们的post请求成功,就意味着它们是一起传输的(Chrome/postman)。
比如w3school说URL的最大长度是2048个字符,所以我们添加一个代码来计算uri的长度。
.# parse first _ line _ array=request . split( \ r \ n )[0]。拆分()打印( URI长度:%s% len(first_line_array[1])).我们使用postman直接发送超过2048个字符
那么我们可以得出结论,url长度限制是某些浏览器和服务器的限制,与HTTP协议无关。
在这里,我们可以假装快乐。
参考:
99%的人都误解了HTTP中GET和POST的区别。关于HTTP GET和POSTw3school: HTTP方法:GET和post的比较wikipedia:超文本传输协议RFC 2068
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。