【get/post、同步/异步、阻塞/非阻塞】

说到 get 和 post 请求,很多同学都会联想到同步和异步,其实 get 和 post 请求属于 http 协议中的请求,与同步,异步并没有直接的关系,而与同步、异步经常比较的就是阻塞与非阻塞请求。本文将仔细阐述它们各自的特点以及区别。


1、常见的 HTTP 请求方法

HTTP 协议定义了与服务器交互的不同方法,其中最基本的五种:GET,POST,PUT,DELETE,HEAD。其中 GET 和 HEAD 被称为安全方法,因为使用 GET 和 HEAD 的 HTPP 请求不会对服务器产生什么修改的动作,不会产生动作以为着 GET 和 HEAD 的 HTTP 请求不会在服务器上产生任何结果。但是安全方法并不是什么动作都不产生,这里的安全方法仅仅指不会修改服务器信息。

下面的表格列出了其他一些 HTTP 的请求方法:

方法

描述

HEAD

与 GET 相同,但只返回 HTTP 报头,不返回文档主体。

GET

从指定的资源请求数据

POST

向指定的资源提交要被处理的数据

PUT

上传指定的 URI 表示。

DELETE

删除指定资源。

OPTIONS

返回服务器支持的 HTTP 方法。

CONNECT

把请求连接转换到透明的 TCP/IP 通道。

其中,GET、POST 的不同点在面试中是最经常被问及的:

Form 中的 get 和 post 方法,在数据传输过程中分别对应了 HTTP 协议中的 GET 和 POST 方法。二者主要区别如下:

  • 1、Get 是用来从服务器上获得数据,而 Post 是用来向服务器上传递数据。
  • 2、Get 将表单中数据的按照 variable=value 的形式,添加到 action 所指向的 URL 后面,并且两者使用“?”连接,而各个变量之间使用“&”连接;Post 是将表单中的数据放在 form 的数据体中,按照变量和值相对应的方式,传递到 action 所指向 URL。
  • // get请求:请求数据在url后拼接
    xmlhttp.open(“GET”,“Demo.html?name=”+name,true);
    // post请求:请求数据放在send()中,即请求体中
    xmlhttp.open(“POST”,“Test.html”,true);
    xmlhttp.send(“name=Henry&lname=Ford”);

  • 3、Get 是不安全的,因为在传输过程,数据被放在请求的 URL 中,而如今现有的很多服务器、代理服务器或者用户代理都会将请求URL记录到日志文件中,然后放在某个地方,这样就可能会有一些隐私的信息被第三方看到。另外,用户也可以在浏览器上直接看到提交的数据,一些系统内部消息将会一同显示在用户面前。Post 的所有操作对用户来说都是不可见的。
  • 4、Get 传输的数据量小,这主要是因为受 URL 长度限制;而 Post 可以传输大量的数据,所以在上传文件只能使用 Post(当然还有一个原因,将在后面的提到)。
  • 5、Get 限制 Form 表单的数据集的值必须为 ASCII 字符;而 Post 支持整个 ISO10646 字符集。
  • 6、Get 是 Form 的默认方法。

使用 Post 传输的数据,可以通过设置编码的方式正确转化中文;而 Get 传输的数据却没有变化。在以后的程序中,我们一定要注意这一点。

POST 虽然说相对安全,但是账号密码在网页依旧是明文的,极容易窃取,因此私密信息最好不用 POST 传输。以下我用自己的 web 系统举一个例子:

2、阻塞与非阻塞

以经典的读取文件的模型举例。(对于操作系统而言,所有的输入输出设备都将被抽象成文件。)

在发起读取文件的请求时,应用层会调用系统内核的 I/O 接口。

如果应用层调用的是阻塞型I/O,那么在调用之后,应用层即刻被挂起,一直出于等待数据返回的状态,直到系统内核从磁盘读取完数据并返回给应用层,应用层才用获得的数据进行接下来的其他操作。

如果应用层调用的是非阻塞I/O,那么调用后,系统内核会立即返回(虽然还没有文件内容的数据),应用层并不会被挂起,它可以做其他任意它想做的操作。(至于文件内容数据如何返回给应用层,这已经超出了阻塞和非阻塞的辨别范畴。)

这便是(脱离同步和异步来说之后)阻塞和非阻塞的区别。总结来说,是否是阻塞还是非阻塞,关注的是接口调用(发出请求)后等待数据返回时的状态。被挂起无法执行其他操作的则是阻塞型的,可以被立即「抽离」去完成其他「任务」的则是非阻塞型的。

3、同步和异步

阻塞和非阻塞解决了应用层等待数据返回时的状态问题,那系统内核获取到的数据到底如何返回给应用层呢?这里不同类型的操作便体现的是同步和异步的区别。

对于同步型的调用,应用层需要自己去向系统内核问询,如果数据还未读取完毕,那此时读取文件的任务还未完成,应用层根据其阻塞和非阻塞的划分,或挂起或去做其他事情(所以同步和异步并不决定其等待数据返回时的状态);如果数据已经读取完毕,那此时系统内核将数据返回给应用层,应用层即可以用取得的数据做其他相关的事情。

而对于异步型的调用,应用层无需主动向系统内核问询,在系统内核读取完文件数据之后,会主动通知应用层数据已经读取完毕,此时应用层即可以接收系统内核返回过来的数据,再做其他事情。

这便是(脱离阻塞和非阻塞来说之后)同步和异步的区别。也就是说,是否是同步还是异步,关注的是任务完成时消息通知的方式。由调用方盲目主动问询的方式是同步调用,由被调用方主动通知调用方任务已完成的方式是异步调用。


4、总结

提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。

到这里,已经把阻塞和非阻塞、同步和异步 的概念给说清楚了,最后这里对上述进行一个小结,阐述一个异步非阻塞模型是怎样的:

完整来说,一个最高效且理想的文件读取异步非阻塞模型应该是这样的:应用层发起调用后系统内核立即返回(还没有文件内容数据),应用层继续做其他无关的事情,在系统内核从磁盘读取完数据之后主动通知应用层任务已完成,应用层此时接收系统内核返回的数据,然后继续做其他相关或不相关的事情。

文章引用:

菜鸟教程 HTTP 请求

完全理解同步/异步与阻塞/非阻塞

同步和异步以及get、post请求方式的区别

猜你喜欢

转载自blog.csdn.net/Your_Boy_Tt/article/details/129999539