Http请求方法之Get、Post原理
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 ⽅法参数写法是固定的吗?
恢复历史浏览记录
  在约定中,我们的参数是写在 ? 后⾯,⽤ & 分割。如下: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性能差可以⼈为忽略。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。