Java--HTTP(上)
HTTP是什么
HTTP(超文本传输协议)是一种应用非常广泛的应用层协议。
HTTP在传输层主要依赖的是TCP协议,但是从HTTP3.0开始,切换到了UDP
这是因为HTTP3.0应用层这里自己实现了可靠传输,而TCP特别影响性能
HTTP的主要应用场景
1.web开发中:网页前端和服务器后端之间的通信
2.移动端app和服务器后端之间的通信
3.分布式系统的服务器之间调用
与HTTPS的区别
HTTP本心不加密数据,存在安全风险,而HTTPS是HTTP的安全版本,核心区别在于加密
HTTP:数据以明文形式传输,容易被窃听伪造
HTTPS:通过SSL/TLS协议对传输数据进行加密,可验证服务器身份,确保数据的完整性和机密性。
客户端服务器的交互模型:
1.多问一答 : 上传一个大文件
2.一问多答 : 下载一个大文件
3.多问多答 : 远程桌面
理解HTTP协议的工作过程
我们在浏览器输入一个网址,这时候浏览器会给对应的服务器发送一个HTTP请求,当服务器收到请求之后,经过处理就会返回一个HTTP响应

当我们访问网站的时候,会不止一次地触发HTTP请求/响应的交互过程
我们可以通过抓包工具来看到详细的交互数据。
Fiddler
我们通过Fiddler 抓包工具来帮助我们了解HTTP
我们访问 sogou.com,可以通过Fiddler 看到如下图

其中我们可以看到蓝色的条目,这是因为不同的颜色代表不同的数据格式
此时蓝色表示的是 HTML
我们点击Raw,此时显示的就是HTTP原始的数据格式

SyntaxView是将原始的文本数据按照语法规则进行美化后的显示
1.当数据被加密或者压缩的时候会乱码
2.数据是二进制非文本的时候,也会是乱码
3.字符编码不匹配也会乱码
4.数据格式错误或损坏也会乱码

HTTP请求结构:

首行包含三个关键信息:
请求方法:![]()
请求URL:![]()
HTTP版本:![]()
其他行:header 请求报头
![]()
header 有很多行,每一行都是一个键值对,键和值之间通过 :空格来分割
后续 空行 请求头字段之后必须要有一个回车,告诉服务器“请求头已经结束”
最后是请求体 是向服务器提交的具体数据

HTTP响应结构:

第一行:响应行 包含了HTTP版本 状态码 和状态描述
中间部分· 响应头 直到空行为止是服务器向客户端
空行 响应头之后有个空行 用于分割响应头和响应体 告诉客户端响应头结束
响应体:空行之后的内容,即服务器时即返回的资源,也是客户端真正需要的内容
URL(统一资源定位符):
用于定位互联网上的资源,它通过规定的格式告诉浏览器或其他客服端要如何访问以及访问哪里的资源。
以 https://www.sogou.com/ 为例
协议:https
域名:www.sogou.com
路径:/(表示服务器的根目录,通常对应首页)
省略了默认端口443,查询参数和片段标识符
完整结构:
协议://域名:端口/路径?查询参数#片段标识符
URL Encode(URL编码):
作用:将URL中非法字符,特殊字符或者非ASCII字符转换为标准ASCII字符格式的编码方式
目的:避免字符与URL语法冲突,确保数据传输准确
URI 和 URL
URI(统一资源标识符)
URL(统一资源定位符)
URL 是 URI 的子集
URI的核心作用是“标识资源” 告诉你这是什么资源,不一定包含如何访问资源的信息
URL不仅告诉你这是什么资源,而且还告诉你如何访问资源
认识方法:
| GET | 获取资源 | 1.0、1.1 |
| POST | 传输实体主体(常用于提交数据) | 1.0、1.1 |
| PUT | 传输文件(多用于资源创建 / 更新) | 1.0、1.1 |
| HEAD | 仅获取响应头(用于探知资源信息) | 1.0、1.1 |
| DELETE | 删除文件 | 1.0、1.1 |
| OPTIONS | 询问服务器支持的请求方法 | 1.1 |
| TRACE | 追踪请求路径(用于调试,少用) | 1.1 |
| CONNECT | 建立隧道协议连接代理(如 HTTPS 代理) | 1.1 |
| LINK | 建立资源间的关联(较冷门) | 1.0 |
| UNLINE | 断开资源间的连接(较冷门) | 1.0 |
GET 方法最为常用 其次是 POST PUT DELETE
GET方法
对于 GET 方法,通常是没有请求体的
实例:

POST方法
关于POST方法容易在两个场景出现:
1.登录
2.上传文件
示例:

GET和POST的区别:
1.GET通常用来表示“获取数据”语义 POST通常表示“提交数据语义”
2.GET通常把给服务器的数据放到 query string 中,POST 通常放到 body中
(GET和POST没有什么本质区别 能用GET的地方可以换成POST 能用POST的地方也可以换成GET)
GET方法一般实现成幂等,而POST则没有这个要求
幂等性:
多次执行相同的请求,最终对系统资源产生的影响与“只执行一次”完全一致
示例:
修改网名为张三,多次提交请求,最后姓名定格为张三,而不是张三张三
不幂等:
多次执行相同的请求,会对系统资源产生累加的副作用
示例:多次往余额增加10元,最后余额就是累加后的结果
HOST报头:
表示服务器主机的地址和端口号
content - length报头:
表示Body中的数据长度
content-Type 报头
表示请求的body中的数据格式
referer报头
表示这个页面是从哪个页面跳转过来的
Cookie:
Cookie是服务器通过HTTP响应报头下发给客户端的小型文本数据
用于在客户端存储信息,通过请求报头携带回给服务器
核心作用:
记录用户的登陆状态,不用频繁重复的输入账号密码。存储了用户的界面偏好(主题,字体大小等等)
以gitee的主题为例:
![]()
此时是黑色主题,
![]()
两种主题的数据都是存在于Cookie里面的
我们可以将 Cookie里面的 light 改为 dark,此时刷新页面就会将主题改为dark
