HTTP协议
- 应用层协议
- 应用层的作用:为应用程序提供网络服务
- 序列化的意义、为什么要将数据序列化?
- HTTP协议概述
- HTTP的协议格式
- 请求
- 响应
- GET方法和POST方法的出现的场景和区别?
应用层协议
在应用层,需要我们传递应用层所需特殊的数据格式,这种数据可能是连续数据,例如int类型的整形变量,也可能是string类型的字符串,也可能是多个变量构成的结构体,那么就意味着我们发送的数据可能是连续的,也可能是不连续的,这时为了统一数据的解析方法,我们对数据在发送前进行序列化,在接收后进行反序列化。那么无论使用序列化还是反序列化,都需要对数据格式进行约定,以便于一端能够正常进行解析。
而对数据进行约定,使之能够正常的进行构造和解析,这种约定就是应用层协议
应用层的作用:为应用程序提供网络服务
序列化的意义、为什么要将数据序列化?
序列化本质是将离散存储的数据转换为连续的数据,由于大量的数据存储并非连续的,例如一个结构体中嵌套一个指针,而这个指针所指向的是一另一个结构体对象,那么此时当前结构体在存储角度来看就是一个不连续的数据,如果我们贸然当当前的数据进行发送,对方接收到之后,其内部的指针指向的地址就无效了,因此我们需要将数据进行序列化,之后才可以进行存储或者通过网络发送出去。
HTTP协议概述
虽然应用层协议是程序员定的,但是为了方便大量的程序员使用,大佬们已经定义了现成的应用层协议可以直接使用,就比如HTTP协议
HTTP协议是无连接,无状态,工作在应用层的协议。
其中无连接表示HTTP协议本身不维护连接信息,但是HTTP的数据会交给传输层的TCP协议,而TCP是面向连接的。
无状态是指:HTTP本身不会对数据的请求和响应状态进行保存。
HTTP的协议格式
协议格式分为:请求和响应
请求中包含:请求首行,请求头部,空行,请求体
响应中包含:响应首行,响应头部,空行,响应体
请求
注意:GET类型的请求没有请求体
请求首行:[方法] + [url] + [版本]
请求方法主要有:GET、HEAD、PUT、POST、TRACE、OPTIONS、DELETE以及扩展方法,但常用的只有前两个。
请求头部:为请求报文添加了一些附加信息,由“名/值”对组成,每行一对,名和值之间使用冒号分隔
常见请求头部如下:
请求头 | 说明 |
---|---|
Host | 接受请求的服务器地址,可以是IP:端口号,也可以是域名 |
User-Agent | 发送请求的应用程序名称 |
Connection | 指定与连接相关的属性,如Connection:Keep-Alive |
Accept-Charset | 通知服务端可以发送的编码格式 |
Accept-Encoding | 通知服务端可以发送的数据压缩格式 |
Accept-Language | 通知服务端可以发送的语言 |
请求体:GET没有请求体
请求体:POST请求体
响应
响应首行: [版本号] + [状态码] + [状态码解释]
常见的状态码及其含义
状态码 | 含义 |
---|---|
200 | 响应成功 |
301 | 永久重定向,删除源地址,保留重定向地址 |
302 | 临时重定向 |
400 | 客户端请求有语法错误,无法被服务器识别 |
403 | 服务器收到请求,但是拒绝提供服务 |
404 | 请求资源不存在 |
500 | 服务器内部错误 |
响应头部:与请求头部类似,为响应报文提供一些附加信息
常见的响应头部如下:
响应头部 | 说明 |
---|---|
Server | 服务器应用程序软件的名称和版本 |
Content-Type | 响应正文的类型(是图片还是二进制字符串) |
Content-Length | 响应正文长度 |
Content-Charset | 响应正文使用的编码 |
Content-Encoding | 响应正文使用的数据压缩格式 |
Content-Language | 响应正文使用的语言 |
GET方法和POST方法的出现的场景和区别?
GET方法是最常见的请求方法,一般出现于以下几种场景:
1.在浏览器输入URL后点击回车,实际上只要是网址,点击之后都会触发GET请求
2.一些图片的src属性,也会被构造出一个URL
POST方法也比较常见,一般出现于输入用户名和密码之后,点击登录会触发POST请求
GET方法和POST方法的区别?
1.没有本质的区别,可以互相替换
2.语义不同,GET习惯于从服务器获取数据,POST是向服务器提交数据
2.格式不同,GET方法一般没有请求体,而POST方法有,所以GET习惯用URL传递数据,POST习惯用请求体传递数据
3.长度不同:GET方法一般有长度限制,POST请求没有长度限制
4.后续维护不同:GET请求方法返回的内容可以被浏览器缓存起来,而POST方法不会缓存返回的内容
5.读写不同:GET主要是对数据查询,而POST主要对数据进行修改