解码HTTP

news/2025/11/25 21:44:15/文章来源:https://www.cnblogs.com/YouEmbedded/p/19261108

HTTP 协议基础

HTTP(超文本传输协议)是应用层的请求 - 响应协议,通常运行在 TCP 之上,专门用于客户端与服务器之间的通信。浏览器访问网站、调用 API 接口等网络行为,本质都是通过 HTTP 协议实现的。

image

超文本的核心是 HTTP 不仅能传输普通文本数据,还支持文件、图片、超链接等多种资源的传输。其标准规范可通过 RFC 文档查询(如 HTTP/1.1 对应 RFC 9112),是互联网通信的核心基础协议。

HTTP 通信流程

HTTP 通信遵循 “请求 - 响应” 模式,完整流程如下:

  • 客户端与服务器通过 TCP 协议建立连接(HTTP 依赖 TCP 的可靠传输特性);
  • 客户端按照 HTTP 规范构造请求报文并发送给服务器;
  • 服务器接收请求后,处理请求并构造响应报文返回给客户端;
  • 客户端接收响应,解析报文获取所需资源;
  • 若为 HTTP/1.1 及以上版本,TCP 连接默认保持(持久连接),可复用该连接发送后续请求。

HTTP 请求报文结构

HTTP 请求报文由请求行、请求首部字段、空行、请求包体四部分组成,各部分以\r\n(回车换行符)分隔,整个报文以\r\n结束。

image

请求行

请求行是请求报文的第一行,格式为:方法 + 空格 + URL + 空格 + 协议版本 + \r\n

  • 方法:请求的操作类型(如 GET、POST);

  • URL:统一资源定位符,指定请求资源在服务器上的路径;

    image

  • 协议版本:如 HTTP/1.1、HTTP/2.0。

示例:GET /v3/weather/now.json HTTP/1.1\r\n

请求首部字段

用于传递额外的请求信息,格式为字段名: 值\r\n,常见核心字段如下:

字段名 作用 示例
Host 指定请求资源所在的服务器域名(必选) Host: api.seniverse.com\r\n
Accept 客户端可处理的媒体类型 Accept: application/json\r\n
Accept-Charset 客户端优先的字符集 Accept-Charset: utf-8\r\n
User-Agent 客户端程序信息(如浏览器版本) User-Agent: Chrome/114.0.0.0
Authorization Web 认证信息(如 token) Authorization: Bearer xxx

image

注意:HTTP/1.1 协议要求所有请求必须包含 Host 字段,否则服务器会返回 400 错误(Bad Request)。

空行

\r\n组成,用于分隔请求首部和请求包体,是协议规定的必需部分。

请求包体

可选部分,用于传递大量数据(如表单提交、文件上传),GET 请求通常无包体,POST 请求常用包体传递参数。

HTTP 请求方法

HTTP 定义了多种请求方法,每种方法对应特定的操作语义,核心方法如下:

image

注意:HTTP 是可拓展协议,实际使用的请求方法由服务端决定,并非必须遵循上述语义。

HTTP 协议版本

HTTP 版本采用 “主版本号。次版本号” 格式(如 HTTP/major.minor),核心版本特点如下:

  • HTTP/0.9:最初版本,仅支持 GET 方法,无首部字段,仅传输纯文本;
  • HTTP/1.0:支持多种请求方法和首部字段,每次请求需建立新的 TCP 连接(短连接);
  • HTTP/1.1:目前主流版本,支持持久连接(TCP 连接默认不关闭,可复用)、管道化请求,新增 OPTIONS、TRACE 等方法;
  • HTTP/2.0:基于二进制帧传输,支持多路复用、头部压缩,性能大幅提升。

持久连接优势:减少 TCP 连接建立 / 关闭的开销,提高多资源请求的效率(如网页加载多个图片时无需重复建连)。

HTTP 响应报文结构

服务器接收请求后返回响应报文,结构与请求报文对应,由状态行、响应首部字段、空行、响应包体四部分组成。

image

状态行

格式为:协议版本 + 空格 + 状态码 + 空格 + 状态描述 + \r\n

  • 状态码:3 位数字,标识请求处理结果;
  • 状态描述:对状态码的文字说明(如 OK、Not Found)。

示例:HTTP/1.1 200 OK\r\n

响应首部字段

传递服务器的附加信息,常见字段如下:

字段名 作用 示例
Content-Type 响应包体的媒体类型(如 JSON、HTML) Content-Type: application/json
Content-Length 响应包体的字节长度 Content-Length: 266
Date 服务器响应时间 Date: Fri, 07 Jun 2024 05:53:55 GMT
Connection 连接状态(keep-alive 表示持久连接) Connection: keep-alive

空行

\r\n组成,分隔响应首部和响应包体。

响应包体

服务器返回的实际资源,如 HTML 页面、JSON 数据、图片等(HEAD 请求无包体)。

HTTP 状态码

状态码按首位数字分为 5 大类,核心状态码含义如下:

image

  • 1xx(信息性状态码)
    • 100 Continue:服务器已接收请求首部,客户端可继续发送包体;
    • 101 Switching Protocols:服务器同意切换协议(如 HTTP 切换到 WebSocket)。
  • 2xx(成功状态码)
    • 200 OK:请求成功,服务器返回指定资源;
    • 201 Created:资源创建成功(如 PUT 请求创建文件);
    • 204 No Content:请求成功,但无响应包体。
  • 3xx(重定向状态码)
    • 301 Moved Permanently:资源永久迁移,需访问新 URL;
    • 302 Found:资源临时迁移,临时访问新 URL;
    • 304 Not Modified:资源未修改,可使用本地缓存。
  • 4xx(客户端错误状态码)
    • 400 Bad Request:请求报文格式错误(如缺少 Host 字段);
    • 401 Unauthorized:请求需身份认证(如未传 token);
    • 403 Forbidden:服务器拒绝请求(如无权限访问);
    • 404 Not Found:请求的资源不存在(最常见错误)。
  • 5xx(服务器错误状态码)
    • 500 Internal Server Error:服务器内部错误(如代码 bug);
    • 502 Bad Gateway:网关错误(如反向代理无法连接后端);
    • 503 Service Unavailable:服务器暂时不可用(如过载、维护);
    • 504 Gateway Timeout:网关超时(如后端服务响应过慢)。

HTTP 实际应用:调用 API 接口

HTTP 最常见的应用是调用开放 API 接口获取数据(如天气、短信验证),核心步骤为:注册平台账号→获取 API 密钥→构造 HTTP 请求→发送请求→解析响应数据。

示例 1:调用心知天气 API 获取天气(C 语言实现)

#include <stdio.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <unistd.h>// 替换为自己的 API 密钥(你的示例密钥可能失效,建议去心知天气官网重新申请)
#define KEY "替换为自己的 API 密钥"
#define LOCAL "guangzhou"int main() {// 创建 TCP 套接字(无修改)int tcp_socket = socket(AF_INET, SOCK_STREAM, 0);if (tcp_socket == -1) {perror("socket创建失败");return -1;}// 解析域名(无修改)struct hostent* host = gethostbyname("api.seniverse.com");if (host == NULL) {perror("域名解析失败");close(tcp_socket);return -1;}// 配置服务器地址(无修改)struct sockaddr_in server_addr;memset(&server_addr, 0, sizeof(server_addr));server_addr.sin_family = AF_INET;server_addr.sin_port = htons(80);memcpy(&server_addr.sin_addr.s_addr, host->h_addr_list[0], host->h_length);// 连接服务器int conn_ret = connect(tcp_socket, (struct sockaddr*)&server_addr, sizeof(server_addr));if (conn_ret == -1) {perror("连接服务器失败");close(tcp_socket);return -1;}printf("已连接到天气服务器\n");// 构造 HTTP 请求(补充 Connection: close,让服务器响应后关闭连接,简化接收逻辑)char reqbuf[1024] = {0};snprintf(reqbuf, sizeof(reqbuf),"GET /v3/weather/now.json?key=%s&location=%s&language=en&unit=c HTTP/1.1\r\n""Host: api.seniverse.com\r\n""Connection: close\r\n"  // 关键:告诉服务器响应后关闭连接,避免循环接收阻塞"\r\n",KEY, LOCAL);// 发送请求(无修改)ssize_t send_len = send(tcp_socket, reqbuf, strlen(reqbuf), 0);if (send_len == -1) {perror("发送请求失败");close(tcp_socket);return -1;}printf("已发送 HTTP 请求,长度:%ld 字节\n", send_len);// 接收完整响应(关键修复:拼接所有数据,不依赖 count)char recvbuf[4096] = {0};  // 扩大缓冲区,避免数据溢出ssize_t total_recv = 0;    // 记录接收的总字节数printf("\n服务器响应:\n");while (1) {ssize_t recv_len = recv(tcp_socket, recvbuf + total_recv, sizeof(recvbuf) - total_recv - 1, 0);if (recv_len <= 0) {break;  // 接收完毕(ret=0)或出错(ret=-1)}total_recv += recv_len;}recvbuf[total_recv] = '\0';  // 手动添加字符串结束符,避免乱码// 打印完整响应(含头和体)printf("%s\n", recvbuf);close(tcp_socket);printf("\n连接已关闭\n");return 0;
}

示例 2:调用互亿无线 API 发送短信验证码

核心步骤:

  • 注册互亿无线账号,完成个人认证;
  • 在控制台获取 APIID 和 APIKEY;
  • 构造 POST 请求(参数含手机号、验证码、APIID、APIKEY);
  • 发送请求并接收响应(判断短信是否发送成功)。

关键请求参数(POST 示例):

//请求头
POST /webservice/sms.php?method=Submit&format=json HTTP/1.1\r\nHost: 106.ihuyi.cn\r\nContent-Type: application/x-www-form-urlencoded\r\nContent-Length: %d\r\n\r\n//请求包体
account=xxxxxxxxx&password=xxxxxxxxxxxx&mobile=xxxxxxxxxx&content = 您的验证码是:8888。请不要把验证码泄露给他人。
参数:
- account: 你的APIID
- password: 你的APIKEY
- mobile: 接收验证码的手机号
- content: 短信内容(需包含签名,如【互亿无线】您的验证码是:123456,请在5分钟内完成验证)

HTTP 与 HTTPS 的区别

特性 HTTP HTTPS
安全层 无,明文传输 基于 SSL/TLS 加密,密文传输
端口 默认 80 端口 默认 443 端口
数据安全性 低,易被窃听、篡改、伪造 高,加密保护数据完整性和真实性
证书要求 无需证书 需申请 SSL 证书(如 Let's Encrypt 免费证书)
性能 无加密开销,性能较高 加密 / 解密有开销,性能略低
适用场景 普通资源访问(如静态网页) 敏感数据传输(如登录、支付、API 调用)

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计你太美

计(数)你太美!背背 计(数)你太美!背背 计(数)你式子屎太美!背背 计(数)你太美!背背 迎面走来的你让我如此蠢蠢欲动 这种感觉我从未有 Cause I got a crush on you who you 你是我的我是你的谁 再多一眼看一…

畅通工程 最小生成树

贪心权重,几个优化点注意以下 1.提前退出的优化 我们的auto会遍历未初始化的部分 2.排序排的是边不是n(点) 又是看似正确实则错误的地方 #include <bits/stdc++.h> using namespace std; struct node {int u,v,…

Oracle数据库物理备份与恢复实战指南

Oracle数据库物理备份与恢复实战指南1. RMAN基础概念 1.1 什么是RMAN RMAN(Recovery Manager)是Oracle 8i以后DBA的重要工具,位于$ORACLE_HOME/bin目录下,主要用于备份、还原和恢复操作。RMAN组成:可执行文件:rm…

实用指南:Kafka面试精讲 Day 30:Kafka面试真题解析与答题技巧

实用指南:Kafka面试精讲 Day 30:Kafka面试真题解析与答题技巧2025-11-25 21:23 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !impo…

2025年比亚迪汉更换轮胎推荐:专业TOP5排名权威发布

2025年比亚迪汉更换轮胎推荐:专业TOP5排名权威发布为解决用户在“比亚迪汉更换轮胎推荐”上的选择难题,本文将基于全球主流汽车媒体(如《AutoBild》、汽车之家等)的公开评测模型与数据,从以下四大核心维度,对市场…

2025年大众帕萨特更换轮胎推荐:官方权威指南深度解析

2025年大众帕萨特更换轮胎推荐:官方权威指南深度解析在消费升级与精细化养车理念并行的新时代,越来越多的车主不再满足于“能用就行”的轮胎更换逻辑,尤其对于像大众帕萨特这样兼具德系操控质感与商务舒适定位的B级…

2025-11-25 ZYZ28-NOIP模拟赛-Round9 hetao1733837的record

2025-11-25 ZYZ28-NOIP模拟赛-Round9 hetao1733837的record2025-11-25 ZYZ28-NOIP模拟赛-Round9 hetao1733837的record 比赛链接:ZYZ28-NOIP模拟赛-Round9 A.colorful 提交链接:09-A 题面 题目描述 小 Z 最近收到了一…

学习02

操作系统有什么用操作系统类似于管家身份帮助我们与语言不通的奴隶交流 能够将我们的指令转达给CPU,让CPU去工作 方便我们与计算机之间进行交流 可以将我们的指令变成0和1传达给计算机计算机由哪三大部分组成?硬件 应…

有用的包 #Python

整理一点有用的包,持续更新中~ pandas 数据处理神器,一维、二维数据,安装命令pip install pandas读取文件 import pandas as pd df = pd.read_csv("data.csv") # 读取 CSV 文件 df = pd.read_ex…

Python稳定ABI未来发展与接口机制详解

本文详细探讨了Python稳定ABI的未来发展方向,包括新的abi2026标准、运行时ABI发现机制、接口API设计等核心技术内容,旨在解决自由线程构建与GIL构建的兼容性问题,为扩展模块开发者提供长期稳定的二进制接口解决方案…

2025 人事管理工具选型:不同方案优劣势测评,中小企业闭眼抄作业

又到年底做预算的时候了,很多企业主和HR负责人开始头疼一个问题:明年该用哪套人事管理系统? 市面上产品这么多,从用友、金蝶这些老牌厂商到钉钉、企业微信这类办公平台,价格从几千到几十万,功能看起来都差不多,…

NOIP2025游记/OI生涯回忆

其实去年这个时候写过一个,但是那更像是一个 CSP 考挂之后的宣泄吧,这次认真写一个,起码能在记忆里回到从前。 2021 7 月份的时候去 dsfz 的 C 层集训,当时水平很菜,记得模拟赛的前几题是奥数题,然后可能有一半都…

2025年大众途观L更换轮胎推荐:五大专业品牌最新推荐

2025年大众途观L更换轮胎推荐:五大专业品牌最新推荐为解决用户在“大众途观L更换轮胎推荐”上的选择难题,本文将基于全球主流汽车媒体(如《AutoBild》、汽车之家等)的公开评测模型与数据,从以下四大核心维度,对市…

详细介绍:Python之aedev-setup-project包语法、参数和实际应用案例

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

树上背包优化

树上背包优化 树形背包 这道题卡 nw 背景 这是在上课的时候打的,就长话短说。这道题其实我还是不是很明白,不过如果是刷表的方式的话,代码虽然常数会大一点但胜在易于理解。 但如果是打表,它是从孩子向父亲或者兄弟…

2025年11月十大效果图公司客观评价:详实数据构建的推荐榜单

作为建筑、地产及相关行业从业者,在选择效果图服务供应商时往往面临诸多挑战。无论是建筑设计院需要呈现方案细节,开发商需进行项目预售展示,还是会展公司要完成视觉包装,高质量的效果图已成为项目沟通与决策的重要…

2025年11月十大效果图公司推荐榜单:用户口碑评价与性能参数对比

作为建筑、地产及相关行业从业者,在选择效果图公司时往往面临诸多挑战。无论是建筑师需要精准呈现设计理念,还是开发商要求高质量视觉营销材料,抑或政府部门寻求城市发展规划展示,专业的效果图服务都成为项目成功的…

Tarjan算法总结

强联通分量点击查看代码 #include<bits/stdc++.h>using namespace std;int n,m; vector<int> e[10005];int dfn[10005],low[10005],timtp; int stk[10005],stktp; bool instk[10005]; int scccnt,inscc[10…

【CV】【IRSRMamba】basicSR库

介绍IRSRMamba模型中的basicSR库的代码结构

2025年11月十大效果图公司推荐榜单:专业分析与权威评测对比

在建筑设计与地产开发领域,效果图是项目沟通与决策的重要媒介。无论是建筑师、开发商还是项目业主,在推进项目时往往面临选择合适效果图公司的难题。用户可能因项目汇报、营销宣传或方案比选等需求,寻求高品质的视觉…