GET和POST是什么? HTTP协议中的两种发送请求的方法。
HTTP是什么? HTTP是基于TCP/IP的关于数据如何在万维网中如何通信的协议。
如果去面试的时候被问到get和post的区别你会怎么回答呢?
- Get是不安全的,因为在传输过程,数据被放在请求的URL中;Post的所有操作对用户来说都是不可见的。
- Get传送的数据量较小,这主要是因为受URL长度限制;Post传送的数据量较大,一般被默认为不受限制。
- Get限制Form表单的数据集的值必须为ASCII字符;而Post支持整个ISO10646字符集。
- Get执行效率却比Post方法好。Get是form提交的默认方法。
因为其实get和post经常使用到,但是如果突然要解释起来,还是会猝不及防,所以特地整理了一下
前言:什么是 HTTP ?
超文本传输协议(HTTP)的设计目的是保证客户端与服务器之间的通信。
HTTP 的工作方式是客户端与服务器之间的请求-应答协议。
web 浏览器可能是客户端,而计算机上的网络应用程序也可能作为服务器端。
举例:客户端(浏览器)向服务器提交 HTTP 请求;服务器向客户端返回响应。响应包含关于请求的状态信息以及可能被请求的内容。
两种 HTTP 请求方法:GET 和 POST
在客户机和服务器之间进行请求-响应时,两种最常被用到的方法是:GET 和 POST。
- GET - 从指定的资源请求数据。
- POST - 向指定的资源提交要被处理的数据。
GET 方法:请注意,查询字符串(名称/值对)是在 GET 请求的 URL 中发送的:
/test/demo_form.php?name1=value1&name2=value2
有关 GET 请求的其他一些注释:
- GET 请求可被缓存
- GET 请求保留在浏览器历史记录中
- GET 请求可被收藏为书签
- GET 请求不应在处理敏感数据时使用
- GET 请求有长度限制
- GET 请求只应当用于取回数据
POST 方法:请注意,查询字符串(名称/值对)是在 POST 请求的 HTTP 消息主体中发送的:
POST /test/demo_form.php HTTP/1.1
Host: runoob.com
name1=value1&name2=value2
有关 POST 请求的其他一些注释:
- POST 请求不会被缓存
- POST 请求不会保留在浏览器历史记录中
- POST 不能被收藏为书签
- POST 请求对数据长度没有要求
比较 GET 与 POST
Get和Post在报文上的区别
先下结论,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方法参数应该放在body中。
例如:如果参数是name=tyrion,age=24.
Get方法的简约报文是这样的:
GET /index.php?name=tyrion&age=24 HTTP/1.1
Host: localhost
Post方法的简约报文是这样的:
POST /index.php HTTP/1.1
Host: localhost
Content-type: application/x-www-form-urlencoded
name=tyrion&age=24
当我们知道了两种方法本质上是TCP连接,没有差别,也就是说我们如果不按照规范来也是可以的。我们可以在url上写参数,然后使用Post方法;也可以在Body写参数,然后使用Get,当然,这是需要服务器支持的。
常见问题
1.Get方法参数写法是固定的吗?
在约定中,我们的参数是写在(问号)?后面,用(和号)&分割。
解析报文的过程是通过获取TCP数据,用正则等工具从数据中获取Header和body,从而提取数据,也就是说我们也可以自己约定参数的写法,只要服务器能够解释出来就行了,目前比较流行的一种写法是:
Http://www.example.com/user/name/tyrion/age/24
2.Post方法比Get方法安全?
Post相较于Get是稍微安全一些的,因为数据在地址栏是不可见的。
然后,从传输的角度来说,他们都是不安全的,因为HTTP在网络上都是明文传输的,只要在网络节点上捉包,就能完整的获取数据报文。
想要安全的传输,就只有加密,使用HTTPS。
3.Get方法的长度限制是怎么回事?
我们在网络上看到大多数文章都有提到这一点,浏览器地址栏输入的参数是有限的。
首先说明这一点,HTTP协议没有body和url的长度限制,对url限制的大多是浏览器和服务器的原因。
服务器是因为处理长url要消耗比较多的资源,为了性能和安全(防止恶意构造长url来攻击)考虑,会给url长度加限制。
4.Post方法会产生两个TCP数据包
有些文章当中提到,post会将header和body分开发送,先发送header,服务端返回100状态码在发送body。
HTTP协议中没有明确说明Post会产生两个TCP数据包,而且实际测试chrome发现,header和body不会分开发送。
所以,header和body分开发送是部分浏览器或框架的请求方法,不属于Post必然行为。
HTTP的底层是TCP/IP。所以GET和POST的底层也是TCP/IP,也就是说,GET/POST都是TCP链接。GET和POST能做的事情是一样一样的。你要给GET加上request body,给POST带上url参数,技术上是完全行的通的。
小结
HTTP定义了与服务器交互的不同方法,最常用的方法有四种Put,Delete、post,get,即增删改查。
-
Get,它用于获取信息,它只是获取、查询数据,也就是说它不会修改服务器上的数据,从这点来讲,它是数据安全的,而稍后会提到的Post它是可以修改数据的,所以这也是两者差别之一了。
-
Post,它是可以向服务器发送修改请求,从而修改服务器的,比方说,我们要在论坛上回贴、在博客上评论,这就要用到Post了,当然它也是可以仅仅获取数据的。
-
Delete 删除数据。可以通过Get/Post来实现。用的不多。
-
Put,增加、放置数据,可以通过Get/Post来实现。用的不多。
参考链接:https://zq.zhaopin.com/question/5192936/
参考链接:https://blog.csdn.net/qq_41939384/article/details/87628188
参考链接:https://www.cnblogs.com/mark5/p/11075383.html
参考链接:https://www.runoob.com/tags/html-httpmethods.html