1. HTTP协议
HTTP(超文本传输协议)是现成一些好用协议其中之一。在互联网世界中,HTTP(HyperText Transfer Protocol,超文本传输协议)是一个至关重要的协议。 它定义了客户端(如浏览器)与服务器之间如何通信,以交换或传输超文本(如HTML文档)
HTTP协议是客户端与服务器之间通信的基础。客户端通过HTTP协议向服务器发送请求,服务器收到请求后处理并返回响应。HTTP协议是一个无连接、无状态的协议,即每次请求都需要建立新的连接, 且服务器不会保存客户端的状态信息
2. URL
统一资源定位器,俗称的"网址"
- 像 / ? : 等这样的字符,已经被 url 当做特殊意义理解了。因此这些字符不能随意出现。如某个参数中需要带有这些特殊字符,就必须先对特殊字符进行转义(urlencode)。转义的规则如下:将需要转码的字符转为16进制,然后从右到左,取4位(不足4位直接处理),每2位做一位,前面加上%,编码成%XY格式
- urldecode就是urlencode的逆过程
3. 请求与响应格式
3.1 HTTP请求

- 首行:[方法] + [url] + [版本]
- Header:请求的属性,冒号分割的键值对。每组属性之间使用 \r\n 分隔
- 遇到空行表示Header 部分结束
- Body:空行后面的内容都是Body。Body允许为空字符串
- 如果Body存在,则在Header中会有一个Content-Length属性来标识Body的长度
HTTP 请求的本质(静态资源场景),就是在目录中的特定路径,即uri中的路径,请求特定的资源
如把服务器的 Web 根目录设为**./wwwroot,** 浏览器访问http://127.0.0.1:8080/index.html ,服务器就会去读**./wwwroot/index.html**

3.2 HTTP响应

- 首行:[版本号] + [状态码] + [状态码解释]
- Header:请求的属性,冒号分割的键值对。每组属性之间使用 \r\n分隔
- 遇到空行表示Header部分结束
- Body:空行后面的内容都是Body。Body允许为空字符串
- 如果Body存在,则在Header中会有一个Content-Length属性来标识Body的长度,表明正文大小
- 如果服务器返回了一个html页面,那么html页面内容就是在body中

4. HTTP的方法

其中最常用的就是GET和POST
4.1 GET 方法(重点)
用途:用于请求URL指定的静态网页或者资源
示例: GET /index.html HTTP/1.1
特性:
- GET通过 URI 指定资源地址,服务器解析该 URI 后,直接返回对应响应内容
- GET 提交参数,就是直接拼在 URI 里提交给服务器,所以这个参数有长度限制
- 参数是明文、不安全
4.2 POST 方法(重点)
用途:用于传输实体的主体,通常用于提交表单数据
示例: POST /submit.cgi HTTP/1.1
特性:
- 可以发送大量的数据给服务器,并且请求参数包含在请求正文中
- 参数不会回显,更加私密
其实,GET和POST都不安全,都可以被抓取获得 (一个工具:fiddler)。如何做到真正安全?用https协议进行加密!
4.3 PUT 方法(不常用)
用途:用于传输文件,将请求报文主体中的文件保存到请求URL指定的位置
示例: PUT /example.html HTTP/1.1 特性:不太常用,但在某些情况下,如RESTful API中,用于更新资源
4.4 HEAD方法
用途:与GET方法类似,但不返回报文主体部分,仅返回响应头
示例: HEAD /index.html HTTP/1.1
特性:确认URL的有效性及资源更新的日期时间等
4.5 DELETE方法(不常用)
用途:用于删除文件,是PUT的相反方法
示例: DELETE /example.html HTTP/1.1
特性:按请求URL删除指定的资源
4.6 OPTIONS方法
用途:用于查询针对请求URL指定的资源支持的方法
示例: OPTIONS * HTTP/1.1
特性:返回允许的方法,如GET、POST等
5. HTTP的状态码
HTTP 状态码就是服务器响应返回给客户端时用的,告诉浏览器 / 接口调用方这次请求成功、失败、跳转、权限不足还是服务器报错

常用状态码
200,404,403,302,504
| 状态码 | 英文释义 | 实际应用场景 |
|---|---|---|
| 100 | Continue | 上传大文件时,服务器告知客户端可以继续上传 |
| 200 | OK | 访问网站首页,服务器返回网页内容 |
| 201 | Created | 发布新文章,服务器返回文章创建成功的信息 |
| 204 | No Content | 删除文章后,服务器返回 "无内容" 表示操作成功 |
| 301 | Moved Permanently | 网站换域名后自动跳转到新域名;搜索引擎更新网站链接使用 |
| 302 | Found / See Other | 用户登录成功后,重定向到用户首页 |
| 304 | Not Modified | 浏览器缓存机制,资源未修改时返回该状态码 |
| 400 | Bad Request | 表单提交时数据格式错误,请求参数不合法 |
| 401 | Unauthorized | 访问需登录页面,未登录或身份认证失败 |
| 403 | Forbidden | 访问自身无权限查看的页面资源 |
| 404 | Not Found | 访问不存在的网页链接、接口地址 |
| 500 | Internal Server Error | 服务器代码异常、数据库错误导致页面无法加载 |
| 502 | Bad Gateway | 代理服务器无法从上游服务器获取有效响应 |
| 503 | Service Unavailable | 服务器维护、负载过高,暂时无法处理请求 |
| 504 | Gateway Timeout | 网关超时,代理 / 网关服务器等不到上游服务器响应,超时断开 |
重定向
| 状态码 | 含义 | 是否为临时重定向 | 应用样例 | Location 作用 |
|---|---|---|---|---|
| 301 | Moved Permanently | 否(永久重定向) | 网站换域名后,自动跳转到新域名;搜索引擎更新网站链接时使用 | 浏览器缓存跳转地址,搜索引擎收录新地 |
| 302 | Found / See Other | 是(临时重定向) | 用户登录成功后,重定向到用户首页 | 浏览器缓存跳转地址,搜索引擎收录新地 |
| 307 | Temporary Redirect | 是(临时重定向) | 临时重定向资源到新的位置,保留请求方法和 Body | 保留 POST / 原请求方式,按 Location 地址跳转址跳转 |
| 308 | Permanent Redirect | 否(永久重定向) | 永久重定向资源到新的位置,保留请求方法和 Body | 永久保留原请求方式,按 Location 地址跳转 |
HTTP状态码301(永久重定向)和302(临时重定向)都依赖Location选项。以下是关于两者依赖 Location选项的详细说明:
301
-
当服务器返回HTTP 301状态码时,表示请求的资源已经被永久移动到新的位置
-
在这种情况下,服务器会在响应中添加一个Location头部,用于指定资源的新位置。这个Location 头部包含了新的URL地址,浏览器会自动重定向到该地址
-
例如,在HTTP响应中,可能会看到类似于以下的头部信息:
bashHTTP/1.1 301 Moved Permanently\r\n Location: https://www.new-url.com\r\n
302
-
当服务器返回HTTP 302状态码时,表示请求的资源临时被移动到新的位置
-
服务器会在响应中添加⼀个Location头部来指定资源的新位置。浏览器会暂时使用新的URL进行后续的请求,但不会缓存这个重定向
-
例如,在HTTP响应中,可能会看到类似于以下的头部信息
bashHTTP/1.1 302 Found\r\n Location: https://www.new-url.com\r\n
6. HTTP常见头部字段 Header
请求头
- Content-Type:请求体数据类型(text/html等)
- Content-Length:请求体Body的字节长度
- Host:告知服务器请求的主机名 + 端口
- User-Agent:标识客户端操作系统、浏览器、设备版本信息
- Referer:记录当前请求从哪个页面跳转过来
响应头
- Location:配合3xx 重定向状态码,告诉客户端跳转的目标 URL
- Cookie(请求 / 响应都可):客户端存储少量文本信息,常用于会话保持、身份识别、登录状态
connection报头:长连接
HTTP中的 Connection 字段是HTTP报文头的一部分,控制HTTP 连接是否复用**,**决定请求完后要不要断开 TCP 连接
- Connection: close
- 短连接
- 一次 HTTP 请求响应完毕,立刻断开 TCP 连接
- HTTP/1.0 默认就是短连接
2.Connection: keep-alive
- 长连接(持久连接)
- 一次通信完不断开 TCP,后续请求可以复用同一个 TCP 通道
- HTTP/1.1 默认启用长连接,不用手动写这个头
7. 实现一个简单的HTTP服务
思路:



简易HTTP实现
https://gitee.com/dwaekkiyo/my_linux_code/tree/master/260426