HTTP协议

28 阅读4分钟

什么是HTTP协议

  • 协议,在计算机领域指通信双方为了实现通信而设计的约定或通话规则
  • HTTP协议,是W3C制定的超文本传输协议,是因特网上应用最广泛的网络传输协议
  • HTTP协议包括客户端和服务端两个实体,客户端发送请求给服务端,服务端返回响应给客户端
  • 在HTTP中,数据称为资源(可以是HTML文档、图片、普通文本等),资源通过URL进行定位

image.png

什么是URL

  • URL(Uniform Resource Locator),统一资源定位符。
  • URL 是因特网上资源的地址,通过 URL 可以在因特网上定位到一个唯一的资源。
  • URL由“协议”、“主机名(包含端口号)”、“资源路径”三部分组成。

image.png

HTTP请求方式

  • HTTP协议定义了9种请求方式,来表明对资源不同的操作方式,最常用的是 GET 和 POST
  • GET 用于获取数据(例如查询酒店剩余空房),POST用于提交数据(例如下单预定房间)

image.png

简单代码实现浏览器发送GET和POST请求

  • 使用 HTML form 表单提交
  • 使用 Chrome,右键 -> 检查 -> Network,查看请求方式

image.png

image.png

HTTP请求的格式

  • HTTP请求由请求行、请求头、空白行、请求体四部分组成
  • 请求行,包括请求方式、资源路径(get请求还包含queryString)、协议版本
  • 请求头,为服务器提供了一些额外信息,包括一些访问的域名、用户信息、 Cookie等信息
  • 空白行,用于分隔请求头和请求体
  • 请求体,客户端提交的数据

image.png

HTTP响应的格式

  • HTTP响应由状态行、响应头、空白行、响应体四部分组成
  • 状态行,包括协议版本、状态码及状态描述
  • 响应头,为客户端提供一些额外信息,包括响应时间、响应体长度等信息
  • 空白行,用于分隔响应头和响应体
  • 响应体,服务端返回的数据

image.png

HTTP状态码

HTTP 状态码由三个十进制数字组成,第一个十进制数字定义了状态码的类型。响应分为五类:

image.png

GET和POST的区别

区别一:使用目的

  • GET 请求用于获取资源(例如各种查询服务),是无副作用的
  • POST 请求用于传入实体对象(进行添加、修改、删除等操作),是有副作用的

区别二:传递参数的方式

  • GET 请求将参数放到URL中
  • POST 请求将参数放到请求体中

区别三:参数长度限制(这是浏览器的限制,不是W3C的规范的限制)

  • GET 请求对参数长度有限制
  • POST 请求对参数长度无限制

区别四:支持的参数类型

  • GET 请求的参数只能为普通字符串
  • POST 请求可以发送任何类型的数据,包括普通字符串、文件、视频、音频等

区别五:幂等性

  • GET 请求是幂等的(并没有严格限制,规范建议GET请求应该是幂等的)
  • POST 请求不是幂等的

区别六:作为浏览器书签

  • GET 请求可以作为浏览器书签
  • POST 请求不能作为浏览器书签。一方面,浏览器书签保存的是URL,POST请求体中的信息书签无法保存;另一方面,POST 请求有副作用,不希望每次打开书签都进行一次有副作用的操作

区别七:在浏览器上回退

  • GET 请求后退不会有影响
  • POST 请求后退会再次提交

区别八:对缓存的支持

  • GET 请求支持缓存(获取静态资源时使用缓存,我们自定义的Servlet一般不支持浏览器缓存)
  • POST 请求不支持缓存

GET和POST如何选择

  • 查询数据使用 GET,创建、修改、删除数据使用 POST
  • 如果参数不是普通字符串,使用 POST
  • 如果参数长度较长,使用 POST
  • 如果不希望参数出现在请求 URL 上,使用 POST
  • 希望作为浏览器书签,使用 GET
  • 希望使用浏览器缓存,使用 GET

思考:GET 和 POST 哪个比较安全?

从数据传输的角度,POST请求“看起来”更安全

  • GET 请求的参数直接出现在地址栏的 URL 中,可以直接从浏览记录里看到请求参数
  • POST 请求的参数在请求体里,无法直接从浏览器地址栏看到请求参数 但 POST 的请求参数也可以通过抓包方式获取,并不绝对安全。安全传输需要加密,使用 HTTPS

从服务端数据的角度,GET请求更安全

  • GET 请求不会变更服务端数据
  • POST 请求会变更服务端数据