HTTP 协议

本文所涉及的测试和示例,都是基于笔者构建的 TcpServer 和 HttpServer 等一系列服务进行的。

项目开源地址:24-10-25 · ZhengTongren/Linux - 码云 - 开源中国

1. HTTP 协议简介

HTTP 是 超文本传输协议 ,它是互联网上应用最为广泛的一种协议,主要用于浏览器和 web 服务器之间的的数据传输。

HTTP 的主要特点:
  • HTTP 是无连接的协议。每次客户端和服务器之间的交互都是独立的,即每次请求之前,客户端都需要建立一个新的连接。

  • HTTP 本身是无状态的,即服务器不会保存客户端的任何信息。

2. URL 结构

URL 统一资源定位符,是互联网上用来标识唯一一台主机 上的唯一资源的地址。

3. HTTP 请求和应答

HTTP 请求和应答都遵守统一的标准,这些标准定义了服务器和客户端之间如何进行通信。

3.1 请求

对于 GET 请求,通常不会有正文部分 ------ "正文"通过 URL 的查询字符串(Query String)进行传递。

下图(包括后续给出的 URL 示例)只为方便展示 HTTP 请求的格式。

HTTP 请求格式:
  • 请求行 : [请求方法][空格][请求URI][空格][HTTP版本]\r\n

  • 请求报头 : HTTP 请求是一组键值对,[Key][: ][Value]

Host : 请求的目标服务器

Content-Type : 请求体中的数据类型

Content-Length : 正文的长度

​ ...

  • 空行 : \r\n
  • 请求体(正文)

HTTP 请求在传输过程中是以字符串的形式存在 的。服务器收到这个字符串后,需要对其进行反序列化,然后根据其相应的内容构建相应的 HTTP 应答。

URL 示例:

GET /index.html HTTP/1.1\r\nHost: www.example.com\r\nUser-Agent: Mozilla/5.0\r\nAccept: text/html\r\nConnection: close\r\n\r\nThis is the request body.

HTTP 请求和应答的每一行都以 \r\n (回车换行符)作为分割符。

3.2 应答
HTTP 应答格式:
  • 状态行 : [HTTP 版本][空格][状态码][空格][状态描述符]\r\n

  • 响应报头 : Key:[空格]Value

  • 空行 : \r\n

  • 响应正文

4. HTTP 请求方法
4.1 GET 请求

GET 请求,请求参数在 URL 中;GET 请求,无请求体。

对于 GET 请求,参数通过 URL 的查询字符串传递,查询字符串位于 URL 路径之后,? 开头,参数之间通过 & 分隔

GET 请求所有参数都在 URL 中,因此通常不包含请求体。

4.2 POST 请求

POST 请求,请求参数在请求体中;POST 请求,有请求体。

POST 请求的参数通过请求体传递,不在 URL 中显示;

POST 请求通常包含请求体,可以传递任意类型的数据,如表单数据、JSON、XML等。

仅将前端部分的请求方法从 GET 修改为 POST ,其余皆不变动。

4.3 GET 方法 和 POST 方法

对于 GET 方法 而言,数据在 URL 中传输,因此会受到 URL 长度的限制 ;而 POST 请求的数据长度没有限制,适合传输大量数据。

尽管 POST 方法比 GET 方法更具备私密性,但是二者都不能保证数据的安全性。

相关推荐
白露与泡影3 分钟前
SpringBoot前后端token自动续期方案
spring boot·后端·状态模式
青梅主码11 分钟前
重磅!《人工智能和大型语言模型的研究前景:应用、挑战和未来方向》:代理型 AI 和大语言模型是否可以整合?
后端
hui函数27 分钟前
Flask-WTF表单验证全攻略
后端·python·flask·web·表单验证
喵手30 分钟前
Java异常处理最佳实践:如何避免捕获到不必要的异常?
java·后端·java ee
猿java42 分钟前
精通MySQL却不了解OLAP和 OLTP,正常吗?
java·后端·面试
喵手1 小时前
Java中的HashMap:你了解它的工作原理和最佳实践吗?
java·后端·java ee
冷月半明1 小时前
把离线 Python 项目塞进 Docker:从 0 到 1 的踩坑实录,一口气讲透 10 个最常见困惑
后端
用户298698530141 小时前
如何使用 Spire.Doc 在 Word 中查找和替换文本?
后端
宫水三叶的刷题日记1 小时前
真的会玩,钉钉前脚辟谣高管凌晨巡查工位,小编随后深夜发文
前端·后端·面试
天天摸鱼的java工程师1 小时前
Go 语言未来会取代 Java 吗?
java·后端