1. HTTP介绍
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方式没有
图示解析如下:
- json格式示例:
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 -
响应体:本次响应的正文内容
格式:没有固定格式,响应什么客户端就得到什么
图示解释如下:
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)来解决这个问题。