HTTP协议,即超文本传输协议(HyperText Transfer Protocol),是基于TCP协议的应用层传输协议。
- 无状态:对事务处理没有记忆能力。客户端发送请求、服务器解析请求、返回响应,这个过程是一个事务,每个事务都是独立的。服务器不会记录前后状态,如果后续请求需要前面请求的响应,则必须重传。一般使用cookie/session来记录状态。
- 无连接:每次连接只处理一个请求。1.1版本可通过connection:Keep-Alive实现长连接。
Cookie与Session
cookie与session是为了解决http协议无状态的问题而设计的。
eg:登录场景。
- 用户登录,服务器创建一个属于当前用户的session,保存当前用户的信息,一般还会设置自动过期时间
- 服务器将session设置到cookie中,返回给客户端
- 客户端保存cookie,并在下次请求时将cookie放在请求头中传给服务器
cookie:在浏览器,保存服务器传来的信息,并在每次请求时自动附带上
session:在服务器端,用来保存用户的标志信息
HTTP请求报文
请求报文——从客户端向服务器发送请求报文
请求报文由请求行、请求头、请求体三部分组成。
使用fiddler可以查看完整的请求信息。
POST XXX/login HTTP/1.1
Host: 192.168.2.87:39081
Connection: keep-alive
Content-Length: 39
Accept: application/json, text/plain, */*
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.82 Safari/537.36
Content-Type: application/json;charset=UTF-8
Origin: http://192.168.2.87:39081
Referer: http://192.168.2.87:39081/login
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Cookie: JSESSIONID=4ecaf0fb2d7340449320124c569e57a7
{"username":"admin","password":"admin"}
请求行
请求行由请求方法、url、协议版本三部分组成。
方法表示对所请求对象进行的操作,HTTP协议支持的方法有:
方法 | 说明 |
---|---|
GET | 请求资源 |
POST | 处理资源,一般用于提交表单或上传文件 |
PUT | 传输文件 |
HEAD | 获得响应头,不返回相应内容,可高效查看某个页面的状态 |
DELETE | 删除资源 |
OPTIONS | 询问服务器支持的方法 |
TRACE | 回显服务器收到的请求,主要用于测试或诊断 |
CONNECT | 让服务器代替客户端访问其他网页 |
GET和POST的区别
- GET用于请求数据,POST用于提交数据
- GET的参数会拼接在url中,POST的参数在请求体中
- GET传送的参数长度有限制,POST没有
- GET比POST更不安全,因为参数直接暴露在URL上
- GET请求只能进行url编码,POST支持多种编码方式
请求头
请求头由一系列键值对组成,主要是客户端发送一些附加信息或者客户端自身的信息
常用的请求头有:
请求头 | 说明 |
---|---|
Referer | 说明跳转地址,可用于防盗链 |
Accept | 说明该请求能支持的相应数据类型 |
Content-Type | 请求体对应的MIME信息 |
POST方法的content-type类型
-
application/x-www-form-urlencoded
默认表单提交方式,格式如:key1=val1&key2=val2,不支持二进制数据 -
multipart/form-data
与application/x-www-form-urlencoded类似,但支持文件传输
-
application/json
目前最常用。格式是{"key":"value"},请求体是序列化后的json字符串。 -
text/plain
用于传统ajax请求提交
请求正文
在发送POST请求时,会将参数放在请求正文里传送。
响应报文
响应报文由响应行、响应头、响应体组成。
HTTP/1.1 200 OK
Server: nginx/1.14.0 (Ubuntu)
Date: Wed, 24 Mar 2021 07:03:13 GMT
Content-Type: application/json;charset=UTF-8
Connection: keep-alive
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Access-Control-Allow-Origin: *
Content-Length: 428
{"status":200,"message":"Request successful","data":{"pageNo":1,"pageSize":10,"startTime":null,"endTime":null}}
响应行
由协议/版本、状态码和描述组成。
常见状态码有:
状态码 | 说明 |
---|---|
1XX | 指示消息,服务器已接收了客户端请求,客户端可继续发送请求 |
2XX | 成功,服务器已成功接收到请求并进行处理 |
3XX | 重定向 |
4XX | 客户端的请求有非法内容 |
404 | not found请求资源不存在,如输入流错误的url |
5XX | 服务器端错误 |
500 | 服务器发生错误,如服务器报错 |
503 | 服务器不能处理客户端的请求,在一段时间后,服务器可能会恢复正常 |
响应头
通过响应头来控制浏览器行为。常见响应头有:
响应头 | 说明 |
---|---|
Set-Cookie | 服务器向浏览器写入cookie |
Location | 与状态码302配合使用完成跳转 |
响应体
服务器返回的具体内容
HTTP和HTTPS
HTTPS:基于HTTP协议,加入SSL进行加密,使HTTP的数据传输更加安全。
- 内容加密:所有信息都是加密传播,中间者无法查看明文信息
- 验证身份:通过证书来验证客户端与服务器是真实的
- 数据保护:通过校验机制防止数据被篡改
网友评论