Get和Post 两种基本请求方式有啥区别呢

GET和POST是什么? HTTP协议中的两种发送请求的方法。

HTTP是什么? HTTP是基于TCP/IP的关于数据如何在万维网中如何通信的协议。

如果去面试的时候被问到get和post的区别你会怎么回答呢?

  1. Get是不安全的,因为在传输过程,数据被放在请求的URL中;Post的所有操作对用户来说都是不可见的。
  2. Get传送的数据量较小,这主要是因为受URL长度限制;Post传送的数据量较大,一般被默认为不受限制。
  3. Get限制Form表单的数据集的值必须为ASCII字符;而Post支持整个ISO10646字符集。
  4. 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,即增删改查。

  1. Get,它用于获取信息,它只是获取、查询数据,也就是说它不会修改服务器上的数据,从这点来讲,它是数据安全的,而稍后会提到的Post它是可以修改数据的,所以这也是两者差别之一了。

  2. Post,它是可以向服务器发送修改请求,从而修改服务器的,比方说,我们要在论坛上回贴、在博客上评论,这就要用到Post了,当然它也是可以仅仅获取数据的。

  3. Delete 删除数据。可以通过Get/Post来实现。用的不多。

  4. 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

原创文章 271 获赞 116 访问量 4万+

猜你喜欢

转载自blog.csdn.net/weixin_42554191/article/details/105759202
今日推荐