HTTP报文格式

HTTP请求报文格式

1. 结构:
[请求行]  
[请求头]  
[空行]  
[请求体]  (可选)
  • 请求行方法 URI HTTP版本
    常见方法:GET(获取资源)、POST(提交数据)、PUT(替换资源)、DELETE(删除资源)。
    例如:GET /index.html HTTP/1.1

  • 请求头:键值对形式,传递附加信息(如客户端信息、内容类型等)。
    常见字段:

    • Host: www.example.com (目标域名,HTTP/1.1必需)
    • User-Agent: Mozilla/5.0 (客户端信息)
    • Accept: text/html (客户端可接受的响应类型)
    • Content-Type: application/json (请求体类型,POST/PUT时使用)
    • Content-Length: 27 (请求体的字节长度)
  • 请求体:仅某些方法(如POST、PUT)携带,如提交表单或JSON数据。

2. 示例(GET请求):

http

GET /page.html HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0
Accept: text/html
3. 示例(POST请求):
POST /login HTTP/1.1
Host: www.example.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 29

username=test&password=1234
4. 判断请求头结束的方式
1. 无消息体的请求(如GET、HEAD、DELETE等)
  • 结束标志:请求头(Headers)之后紧跟两个连续的CRLF(即空行),此时请求结束。
  • 示例
    GET /index.html HTTP/1.1\r\n  
    Host: example.com\r\n  
    \r\n  
    
2. 有消息体的请求(如POST、PUT等)

对于包含消息体的请求,需通过以下方式确定结束:

a. 使用 Content-Length 头部
  • 作用:明确指定消息体的字节长度。
  • 判断方式:服务端读取完指定长度的字节后,视为请求结束。
  • 示例
    POST /upload HTTP/1.1\r\n  
    Content-Length: 1234\r\n  
    \r\n  
    <1234字节的数据>  
    
b. 使用分块传输编码(Transfer-Encoding: chunked
  • 作用:将消息体分块传输,适用于动态生成内容或无法预知内容大小的情况。
  • 判断方式
    1. 每个分块以十六进制长度开头,后跟CRLF和数据块。
    2. 以长度标识为0的块表示结束,后跟最终的CRLF。
  • 示例
    POST /data HTTP/1.1\r\n  
    Transfer-Encoding: chunked\r\n  
    \r\n  
    5\r\n  
    Hello\r\n  
    0\r\n  
    \r\n  
    
c. 无Content-LengthTransfer-Encoding的情况
  • HTTP/1.0:无持久连接时,可能依赖客户端关闭连接判断结束(不推荐用于HTTP/1.1)。
  • HTTP/1.1:规范要求必须明确指定长度或使用分块编码,否则服务器会返回400 Bad Request错误。
3. 其他注意事项
  • Expect头处理:若请求包含Expect: 100-continue,服务端需先响应100 Continue状态码,再按规则处理消息体。
  • 协议版本差异:HTTP/1.1严格要求使用Content-Length或分块编码处理持久连接中的请求,而HTTP/1.0可能允许通过关闭连接判断结束。

总结流程图

开始接收请求
├─ 读取请求头直至空行(\r\n\r\n)
├─ 判断是否存在消息体?
│   ├─ 否 → 请求结束
│   └─ 是 → 检查头部:
│       ├─ 若有Content-Length → 读取指定字节数后结束
│       ├─ 若Transfer-Encoding: chunked → 解析分块直至遇到长度0块
│       └─ 无明确标识 → 按协议版本处理(HTTP/1.1返回错误,HTTP/1.0可能读取到连接关闭)
结束

HTTP响应报文格式

1. 结构:
[状态行]  
[响应头]  
[空行]  
[响应体]  (可选)
  • 状态行HTTP版本 状态码 状态消息
    常见状态码:

    • 200 OK:成功
    • 404 Not Found:资源未找到
    • 500 Internal Server Error:服务器错误
    • 301 Moved Permanently:永久重定向
  • 响应头:提供服务器信息或资源元数据。
    常见字段:

    • Server: Apache/2.4 (服务器信息)
    • Content-Type: text/html (响应体类型)
    • Content-Length: 1024 (响应体的字节长度)
    • Set-Cookie: session=abc123 (设置Cookie)
  • 响应体:请求资源的内容(如HTML、JSON、图片等)。

  • 判断HTTP响应结束的方式

  1. Content-Length准则

    • 当响应头包含Content-Length时,消息体需精确读取指定字节数
    • 示例行为:inputStream.read(body)严格读取给定长度
  2. Chunked分块准则

    • Transfer-Encoding: chunked时,循环读取格式为:[块大小]\r\n[块数据]\r\n
    • 终止条件:读取到0\r\n表示所有分块传输完成
  3. 连接关闭准则

    • 无上述头部且非持久连接时,持续读取直到inputStream.read()返回-1
// 伪代码演示HTTP响应结束判断
class HttpResponseParser {

    void parseResponse(InputStream inputStream) throws IOException {
        BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
        Map<String, String> headers = new HashMap<>();
        String line;
        
        // 1. 解析响应头
        while ((line = reader.readLine()) != null) {
            if (line.isEmpty()) break; // 头部结束标记(空行)
            if (line.contains(":")) {
                String[] parts = line.split(":", 2);
                headers.put(parts[0].trim().toLowerCase(), parts[1].trim());
            }
        }

        // 2. 判断消息体结束规则
        if (headers.containsKey("content-length")) {
            // 情况1:通过Content-Length确定结束位置
            int length = Integer.parseInt(headers.get("content-length"));
            byte[] body = new byte[length];
            inputStream.read(body); // 严格读取指定长度
            processBody(body);

        } else if ("chunked".equals(headers.get("transfer-encoding"))) {
            // 情况2:通过分块编码判断结束
            while (true) {
                String chunkSizeLine = reader.readLine();
                int chunkSize = Integer.parseInt(chunkSizeLine.split(";")[0], 16); // 解析16进制长度
                if (chunkSize == 0) break; // 结束标记
                byte[] chunk = new byte[chunkSize];
                inputStream.read(chunk);
                reader.readLine(); // 丢弃块结束的CRLF
                processChunk(chunk);
            }

        } else {
            // 情况3:持续读取直到流关闭(HTTP/1.0旧模式)
            ByteArrayOutputStream buffer = new ByteArrayOutputStream();
            int b;
            while ((b = inputStream.read()) != -1) { // -1表示流结束
                buffer.write(b);
            }
            processBody(buffer.toByteArray());
        }
    }

    // 示例方法:处理完整消息体
    void processBody(byte[] data) { /* ... */ }

    // 示例方法:处理分块数据
    void processChunk(byte[] chunk) { /* ... */ }
}
2. 示例(成功响应HTML):

http

HTTP/1.1 200 OK
Server: Nginx
Content-Type: text/html
Content-Length: 158

<html>
  <head><title>示例页面</title></head>
  <body>Welcome!</body>
</html>
3. 示例(错误响应):

http

HTTP/1.1 404 Not Found
Content-Type: text/plain
Content-Length: 15

Page not found.
4. 示例(JSON响应):

http

HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 28

{"status": "success", "data": {}}

完整交互示例

客户端访问 https://www.example.com/index.html

  1. 请求

http

GET /index.html HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0
Accept: text/html
  1. 响应

http

HTTP/1.1 200 OK
Server: Apache/2.4
Content-Type: text/html
Content-Length: 1234

<!DOCTYPE html>
<html>...</html>

关键注意事项

  1. 空行分隔:头部和主体间必须有一个仅包含CRLF的空行。
  2. 方法区分:GET一般无请求体,POST/PUT通过Content-TypeContent-Length指定请求体格式。
  3. 无状态协议:HTTP协议本身不保存状态,依赖Cookie/Session等机制。
  4. 扩展性:可通过自定义头部字段(如Authorization: Bearer token)实现扩展功能。

掌握HTTP报文格式能帮助理解Web开发、API设计和网络调试(如使用浏览器开发者工具或Fiddler抓包)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/966280.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C++Primer学习(2.1)

前言&#xff1a;与大多数编程语言一样&#xff0c;C的对象类型决定了能对该对象进行的操作&#xff0c;一条表达式是否合法依赖于其中参与运算的对象的类型。一些语言&#xff0c;如Smalltalk和Python 等&#xff0c;在程序运行时检查数据类型;与之相反&#xff0c;C是一种静态…

TensorFlow深度学习实战(7)——分类任务详解

TensorFlow深度学习实战&#xff08;7&#xff09;——分类任务详解 0. 前言1. 分类任务1.1 分类任务简介1.2 分类与回归的区别 2. 逻辑回归3. 使用 TensorFlow 实现逻辑回归小结系列链接 0. 前言 分类任务 (Classification Task) 是机器学习中的一种监督学习问题&#xff0c;…

国产编辑器EverEdit - 查找功能详解

1 查找功能详解 1.1 应用场景 查找关键词应该是整个文本编辑/阅读活动中&#xff0c;操作频度非常高的一项&#xff0c;用好查找功能&#xff0c;不仅可以可以搜索到关键字&#xff0c;还可以帮助用户高效完成一些特定操作。 1.2 基础功能 1.2.1 基础查找功能 选择主菜单查…

5分钟了解回归测试

1. 什么是回归测试&#xff08;Regression Testing&#xff09; 回归测试是一个系统的质量控制过程&#xff0c;用于验证最近对软件的更改或更新是否无意中引入了新错误或对以前的功能方面产生了负面影响&#xff08;比如你在家中安装了新的空调系统&#xff0c;发现虽然新的空…

【AI】卷积神经网络CNN

不定期更新&#xff0c;建议关注收藏点赞。 目录 零碎小组件经验总结早期的CNN 最重要的模型架构无非是cnn 或 transformer 零碎小组件 全连接神经网络 目前已经被替代。 每个神经元都有参与&#xff0c;但由于数据中的特征点变化大&#xff0c;全连接神经网络把所有数据特征都…

企业FTP替代升级,实现传输大文件提升100倍!

随着信息技术的飞速发展&#xff0c;网络安全环境也变得越来越复杂。在这种背景下&#xff0c;传统的FTP&#xff08;文件传输协议&#xff09;已经很难满足现代企业对文件传输的需求了。FTP虽然用起来简单&#xff0c;但它的局限性和安全漏洞让它在面对高效、安全的数据交换时…

LabVIEW铅酸蓄电池测试系统

本文介绍了基于LabVIEW的通用飞机铅酸蓄电池测试系统的设计与实现。系统通过模块化设计&#xff0c;利用多点传感器采集与高效的数据处理技术&#xff0c;显著提高了蓄电池测试的准确性和效率。 ​ 项目背景 随着通用航空的快速发展&#xff0c;对飞机铅酸蓄电池的测试需求也…

Lecture8 | LPV VXGI SSAO SSDO

Review: Lecture 7 | Lecture 8 LPV (Light Propagation Volumes) Light Propagation Volumes(LPV)-孤岛惊魂CryEngine引进的技术 LPV做GI快|好 大体步骤&#xff1a; Step1.Generation of Radiance Point Set Scene Representation 生成辐射点集的场景表示&#xff1a;辐射…

0012—数组

存取一组数据&#xff0c;使用数组。 数组是一组相同类型元素的集合。 要存储1-10的数字&#xff0c;怎么存储&#xff1f; C语言中给了数组的定义&#xff1a;一组相同类型元素的集合。 创建一个空间创建一组数&#xff1a; 一、数组的定义 int arr[10] {1,2,3,4,5,6,7,8,…

AI绘画社区:解锁艺术共创的无限可能(9/10)

AI 绘画&#xff1a;不只是技术&#xff0c;更是社交新潮流 在科技飞速发展的今天&#xff0c;AI 绘画早已不再仅仅是一项孤立的技术&#xff0c;它正以惊人的速度融入我们的社交生活&#xff0c;成为艺术爱好者们交流互动的全新方式&#xff0c;构建起一个充满活力与创意的社…

让office集成deepseek,支持office和WPS办公软件!(体验感受)

导读 AIGC:AIGC是一种新的人工智能技术&#xff0c;它的全称是Artificial Intelligence Generative Content&#xff0c;即人工智能生成内容。 它是一种基于机器学习和自然语言处理的技术&#xff0c;能够自动产生文本、图像、音频等多种类型的内容。这些内容可以是新闻文章、…

c++ template-3

第 7 章 按值传递还是按引用传递 从一开始&#xff0c;C就提供了按值传递&#xff08;call-by-value&#xff09;和按引用传递&#xff08;call-by-reference&#xff09;两种参数传递方式&#xff0c;但是具体该怎么选择&#xff0c;有时并不容易确定&#xff1a;通常对复杂类…

使用springAI实现图片相识度搜索

类似的功能&#xff1a;淘宝拍照识别商品。图片相识度匹配 实现方式&#xff1a;其实很简单&#xff0c;用springai 将图片转换为向量数据&#xff0c;然后搜索就是先把需要搜索的图片转位向量再用向量数据去向量数据库搜索 但是springai现在不支持多模态嵌入数据库。做了一些…

私有化部署DeepSeek并SpringBoot集成使用(附UI界面使用教程-支持语音、图片)

私有化部署DeepSeek并SpringBoot集成使用&#xff08;附UI界面使用教程-支持语音、图片&#xff09; windows部署ollama Ollama 是一个开源框架&#xff0c;专为在本地机器上便捷部署和运行大型语言模型&#xff08;LLM&#xff09;而设计 下载ollama 下载地址&#xff08;…

半导体制造工艺讲解

目录 一、半导体制造工艺的概述 二、单晶硅片的制造 1.单晶硅的制造 2.晶棒的切割、研磨 3.晶棒的切片、倒角和打磨 4.晶圆的检测和清洗 三、晶圆制造 1.氧化与涂胶 2.光刻与显影 3.刻蚀与脱胶 4.掺杂与退火 5.薄膜沉积、金属化和晶圆减薄 6.MOSFET在晶圆表面的形…

正则表达式的简单介绍 + regex_match使用

正则表达式 正则表达式&#xff08;Regular Expression&#xff0c;简称 regex&#xff09;是一种用于匹配字符串的模式。它由一系列字符和特殊符号组成&#xff0c;用于描述、匹配一系列符合某个句法规则的字符串。正则表达式广泛应用于文本搜索、替换、验证等场景。 它的主…

AnythingLLM开发者接口API测试

《Win10OllamaAnythingLLMDeepSeek构建本地多人访问知识库》见上一篇文章&#xff0c;本文在上篇基础上进行。 1.生成本地API 密钥 2.打开API测试页面&#xff08;http://localhost:3001/api/docs/&#xff09; 就可以在页面测试API了 2.测试获取用户接口(/v1/admin/users) 3…

TypeScript 中的类:面向对象编程的基础

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

二级C语言题解:矩阵主、反对角线元素之和,二分法求方程根,处理字符串中 * 号

目录 一、程序填空&#x1f4dd; --- 矩阵主、反对角线元素之和 题目&#x1f4c3; 分析&#x1f9d0; 二、程序修改&#x1f6e0;️ --- 二分法求方程根 题目&#x1f4c3; 分析&#x1f9d0; 三、程序设计&#x1f4bb; --- 处理字符串中 * 号 题目&#x1f…

Qt 支持的动画格式对比,Lottie/APNG/GIF/WEBP

Qt版本&#xff1a;6.7.2 &#xff0c; QML 一&#xff0c;Lottie 在qml中使用LottieAnimation即可&#xff0c;但有三个问题&#xff1a; 1.动画加载中报错&#xff1a; 如果图片&#xff08;.json)本身存在不支持的effect 或shape type等&#xff0c;效果并不好&#xff1a…