zoukankan      html  css  js  c++  java
  • 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性能差可以人为忽略。

     

  • 相关阅读:
    【重点】2020年宝山区义务教育阶段学校校区范围与招生计划(初中)
    转: 彻底理解 Spring 容器和应用上下文
    转《深入理解 Java 内存模型》读书笔记
    Mysql Update 流程摘抄
    统一支付接口设计
    支付系统 简版设计
    订单1:n支付单 设计讨论
    RocketMQ 使用情况梳理
    转 Java jar (SpringBoot Jar)转为win可执行的exe程序
    Git flow 工作流与规范
  • 原文地址:https://www.cnblogs.com/hypo106/p/13302298.html
Copyright © 2011-2022 走看看