Http请求方法之Get、Post原理

什么是HTTP?

  HTTP,即超文本传输协议,是一种实现客户端和服务器之间通信的响应协议,它是用作客户端和服务器之间的请求。

  客户端(浏览器)会向服务器提交HTTP请求;然后服务器向客户端返回响应;其中响应包含有关请求的状态信息,还可能包含请求的内容。

HTTP的常用方法

  1、GET方法

  GET方法用于使用给定的URI从给定服务器中检索信息,即从指定资源中请求数据。使用GET方法的请求应该只是检索数据,并且不应对数据产生其他影响。

  在GET请求的URL中发送查询字符串(名称/值对),需要这样写:/test/demo_form.php?name1=value1&name2=value2

  说明:GET请求是可以缓存的,我们可以从浏览器历史记录中查找到GET请求,还可以把它收藏到书签中;且GET请求有长度限制,仅用于请求数据(不修改)。

  注:因GET请求的不安全性,在处理敏感数据时,绝不可以使用GET请求。

  2、POST方法

  POST方法用于将数据发送到服务器以创建或更新资源,它要求服务器确认请求中包含的内容作为由URI区分的Web资源的另一个下属。

  POST请求永远不会被缓存,且对数据长度没有限制;我们无法从浏览器历史记录中查找到POST请求。

  3、HEAD方法

  HEAD方法与GET方法相同,但没有响应体,仅传输状态行和标题部分。这对于恢复相应头部编写的元数据非常有用,而无需传输整个内容。

  4、PUT方法

  PUT方法用于将数据发送到服务器以创建或更新资源,它可以用上传的内容替换目标资源中的所有当前内容。

  它会将包含的元素放在所提供的URI下,如果URI指示的是当前资源,则会被改变。如果URI未指示当前资源,则服务器可以使用该URI创建资源。

  5、DELETE方法

  DELETE方法用来删除指定的资源,它会删除URI给出的目标资源的所有当前内容。

  6、CONNECT方法

  CONNECT方法用来建立到给定URI标识的服务器的隧道;它通过简单的TCP / IP隧道更改请求连接,通常实使用解码的HTTP代理来进行SSL编码的通信(HTTPS)。

  7、OPTIONS方法

  OPTIONS方法用来描述了目标资源的通信选项,会返回服务器支持预定义URL的HTTP策略。

  8、TRACE方法

  TRACE方法用于沿着目标资源的路径执行消息环回测试;它回应收到的请求,以便客户可以看到中间服务器进行了哪些(假设任何)进度或增量。

 

GET和POST请求都有哪些区别:

  • GET请求在URL中传送的参数是有长度限制的,而POST没有。
  • GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息。而POST数据不会显示在URL中。是放在Request body中。
  • 对参数的数据类型,GET只接受ASCII字符,而POST没有限制。
  • GET请求参数会被完整保留在浏览器历史记录里;相反,POST请求参数也不会被浏览器保留。
  • GET请求只能进行url编码(application/x-www-form-urlencoded),而POST支持多种编码方式。
  • GET请求会被浏览器主动缓存,而POST不会,除非手动设置。
  • GET在浏览器回退时是无害的,而POST会再次提交请求。

Get请求有Request body么?如果有的话参数可以像Post请求一样放在里面么?

  HTTP只是个行为准则,而GET和POST本质上就是TCP链接,并无差别。但是由于HTTP的规定和浏览器/服务器的限制,导致他们在应用过程中体现出一些不同。

  如果给GET加上request body,给POST带上url参数,技术上是完全行的通的。

  如果你用GET服务,在request body偷偷藏了数据,不同服务器的处理方式也是不同的,有些服务器会帮你读出数据,有些服务器直接忽略。所以,虽然GET可以带request body,却不能保证一定能被接收到。

URL中传送参数的长度限制在Get和Post中都是怎么样的呢?

  业界不成文的规定是,(大多数)浏览器通常都会限制url长度在2K个字节,而(大多数)服务器最多处理64K大小的url,超过的部分,恕不处理。如果你用GET服务,在request body偷偷藏了数据,不同服务器的处理方式也是不同的,有些服务器会帮你卸货,读出数据,有些服务器直接忽略。

  所以,虽然GET可以带request body,却不能保证一定能被接收到

那GET 方法参数写法是固定的吗?

  在约定中,我们的参数是写在 ? 后面,用 & 分割。如下:http://ip:port/project/getUserInfo?username=chenhhaha&age=26&sex=2

  我们知道,解析报文的过程是通过获取 TCP 数据,用正则等工具从数据中获取 Header 和 Body,从而提取参数。

  比如header请求头中添加token,来验证用户是否登录等权限问题。

  也就是说,我们可以自己约定参数的写法,只要服务端能够解释出来就行,万变不离其宗。

有人说POST 比 GET 安全,因为数据在地址栏上不可见

  从传输的角度来说,他们都是不安全的,因为 HTTP 在网络上是明文传输的,只要在网络节点上捉包,就能完整地获取数据报文。

  其实,要想安全传输,就只有加密,也就是 HTTPS。

Get、Post请求发送的数据包有什么不同吗?

  GET请求时产生一个TCP数据包;POST请求时产生两个TCP数据包。

  • GET:浏览器会把http header和data一并发送出去,服务器响应200(返回数据)
  • POST:浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 OK(返回数据)

  因为POST需要两步,理论上时间上消耗的要多一点,看起来GET比POST更有效,但并不是。

  1. GET与POST都有自己的语义,不能随便混用。
  2. 据研究,在网络环境好的情况下,发一次包的时间和发两次包的时间差别基本可以无视。而在网络环境差的情况下,两次包的TCP在验证数据包完整性上,有非常大的优点。
  3. 并不是所有浏览器都会在POST中发送两次包,Firefox就只发送一次。我去年用Chrome浏览器测试发现也是只发送一次,所以我认为Get、POST性能差可以人为忽略。

 

Http请求方法之Get、Post原理

上一篇:将地址栏的参数变成json序列化。


下一篇:用Canvas定时显示摄像头捕获的画像(HTML5)