HTTP协议

133 阅读5分钟

1. HTTP介绍

image-20240307200856916.png

HTTP:Hyper Text Transfer Protocol(超文本传输协议),规定了浏览器与服务器之间数据传输时,数据的格式规范。

HTTP协议规定的数据格式由两部分组成

  • HTTP请求:客户端发送给服务端的数据
  • HTTP响应:服务端返回给客户端的数据

HTTP协议是请求驱动的:服务端有请求才会响应:没有请求就没有响应 (服务端高冷闷骚)

2. HTTP请求

2.1 HTTP请求的格式

HTTP请求的格式又分为:

  • 请求行:本次请求的基本信息。

    格式:请求方式 请求路径 协议版本

    示例:GET /hello HTTP/1.1

  • 请求头:本次请求的附加信息。

    格式:一行一个键值对,每一个键值对是一个请求头,一次请求可以有多个请求头

    示例:Host:localhost:8080

  • 请求体:本次请求的正文内容。

    格式:没有固定格式,可以是json,也可以是表单,也可以是二进制

    其中:

    • json格式示例:{"name":"tom", "age": 20}
    • 表单格式示例:name=tom&age=20

    注意:POST和PUT方式才有请求体,GET和DELETE方式没有

    图示解析如下:

image-20240307204806081.png

2.2 HTTP请求方式

在HTTP1.1版本中,浏览器访问服务器的几种方式:

请求方式请求说明
GET获取资源。
向特定的资源发出请求。
POST传输实体主体。
向指定资源提交数据进行处理请求(例:上传文件),数据被包含在请求体中。
OPTIONS返回服务器针对特定资源所支持的HTTP请求方式。
因为并不是所有的服务器都支持规定的方法,为了安全有些服务器可能会禁止掉一些方法,例如:DELETE、PUT等。那么OPTIONS就是用来询问服务器支持的方法。
HEAD获得报文首部。
HEAD方法类似GET方法,但是不同的是HEAD方法不要求返回数据。通常用于确认URI的有效性及资源更新时间等。
PUT传输文件。
PUT方法用来传输文件。类似FTP协议,文件内容包含在请求报文的实体中,然后请求保存到URL指定的服务器位置。
DELETE删除文件。
请求服务器删除Request-URI所标识的资源
TRACE追踪路径。
回显服务器收到的请求,主要用于测试或诊断
CONNECT要求用隧道协议连接代理。
HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器

2.3 GET和POST的区别

区别方式GET请求POST请求
请求参数请求参数在请求行中。
例:/brand/findAll?name=OPPO&status=1
请求参数在请求体中
请求参数长度请求参数长度有限制(浏览器不同限制也不同)请求参数长度没有限制
安全性安全性低。原因:请求参数暴露在浏览器地址栏中。安全性相对高

3. HTTP响应的格式

3.1 HTTP响应的格式

与HTTP的请求一样,HTTP响应的数据也分为3部分:

  • 响应行:本次响应的基本内容

    格式:协议版本 响应状态码 响应描述

    例如:HTTP/1.1 200 OK

  • 响应头:本次响应的附加信息

    格式:一行一个键值对,一个键值对是一个响应头,一次响应可以有多个响应头

    例如:Content-Type: application/json

  • 响应体:本次响应的正文内容

    格式:没有固定格式,响应什么客户端就得到什么

    图示解释如下:

image-20240307210334488.png

3.2 响应状态码

状态码分类说明
1xx响应中 --- 临时状态码。表示请求已经接受,告诉客户端应该继续请求或者如果已经完成则忽略
2xx成功 --- 表示请求已经被成功接收,处理已完成。
比如:200表示成功一切正常完成了
3xx重定向 --- 重定向到其它地方,让客户端再发起一个请求以完成整个处理
比如:302让浏览器跳转到其它指定的地址;304让浏览器取本地缓存数据
4xx客户端错误 --- 处理发生错误,责任在客户端,如:客户端的请求一个不存在的资源,客户端未被授权,禁止访问等。
比如:400请求参数错误,404请求的资源不存在,405请求方式不允许
5xx服务器端错误 --- 处理发生错误,责任在服务端,如:服务端抛出异常,路由出错,HTTP版本不支持等。
比如:500服务器内部错误,503服务不可用

4. HTTP特点

  • 基于TCP协议: 面向连接,安全
  • 请求驱动: 有请求才有响应,没有请求就没有响应
  • HTTP协议是无状态协议: 对于数据没有记忆能力。每次请求-响应都是独立的

无状态指的是客户端发送HTTP请求给服务端之后,服务端根据请求响应数据,响应完后,不会记录任何信息。

  • 缺点: 多次请求间不能共享数据
  • 优点: 速度快

请求之间无法共享数据会引发的问题:

  • 如:京东购物。加入购物车和去购物车结算是两次请求
  • 由于HTTP协议的无状态特性,加入购物车请求响应结束后,并未记录加入购物车是何商品
  • 发起去购物车结算的请求后,因为无法获取哪些商品加入了购物车,会导致此次请求无法正确展示数据

具体使用的时候,我们发现京东是可以正常展示数据的,原因是Java早已考虑到这个问题,并提出了使用会话技术(Cookie、Session)来解决这个问题。