HTTP 入门:从请求到响应的第一课

举报
yd_262156215 发表于 2026/11/12 06:06:25 2026/11/12
【摘要】 每天打开浏览器、刷手机、调用接口,背后都在发生同一种对话:客户端向服务器发请求,服务器回一个响应。这套对话规则就是 HTTP(超文本传输协议)。把它学明白,后面学接口开发、联调排错、性能优化都会轻松很多。这篇文章就带你从一次真实的请求出发,把 HTTP 的来龙去脉讲清楚。 一、HTTP 是什么HTTP 是应用层协议,运行在 TCP 之上(HTTPS 则在 TLS 之上)。它最大的特点是“无状...

每天打开浏览器、刷手机、调用接口,背后都在发生同一种对话:客户端向服务器发请求,服务器回一个响应。这套对话规则就是 HTTP(超文本传输协议)。把它学明白,后面学接口开发、联调排错、性能优化都会轻松很多。这篇文章就带你从一次真实的请求出发,把 HTTP 的来龙去脉讲清楚。

一、HTTP 是什么

HTTP 是应用层协议,运行在 TCP 之上(HTTPS 则在 TLS 之上)。它最大的特点是“无状态”:服务器默认不记住你上一次是谁、做了什么,每次请求都要自带完整信息。登录状态、购物车这些“记忆”,要靠 Cookie、Token、Session 等机制在应用层补上。

HTTP 的工作模式很简单:请求—响应,一问一答。浏览器、手机 App、小程序、curl、Postman 都是客户端;Nginx、Tomcat、Node.js 服务、云函数都是服务器。理解了这个模型,你就抓住了 Web 的主线。

二、一次请求由什么组成

一个 HTTP 请求主要由四部分组成:请求行、请求头、空行、请求体。请求行里有方法、URL 和协议版本,例如 GET /api/user?id=1 HTTP/1.1。请求头是键值对,告诉服务器“我是谁、想要什么格式、带了什么凭证”;请求体则在 POST、PUT 等方法里携带真正要提交的数据。

常见请求方法要分清用途:GET 用来查询,不应产生副作用;POST 用来新建资源;PUT 用来整体更新;DELETE 用来删除;PATCH 用来局部更新。方法本身只是约定,真正起作用的是服务器的实现,所以接口文档一定要写清楚。

下面用 curl 发一次最简单的请求:

curl -i https://example.com/api/hello

加上 -i 可以同时看到响应头。想看完整的请求和响应细节,可以再加 -v,它会打印出 TLS 握手、发送的请求头和收到的响应头,是排错时最顺手的工具。

三、服务器如何响应

响应同样由四部分组成:状态行、响应头、空行、响应体。状态行里的状态码是第一眼要看的东西,它用三位数字告诉你这次请求的结果:

  • 2xx 成功:200 成功,201 已创建,204 无内容;
  • 3xx 重定向:301 永久重定向,302 临时重定向,304 未修改(配合缓存使用);
  • 4xx 客户端错误:400 参数错误,401 未认证,403 无权限,404 资源不存在;
  • 5xx 服务器错误:500 服务器内部错误,502 网关错误,503 服务不可用。

响应头里藏着很多关键信息:Content-Type 说明响应体是什么格式,Content-Length 说明有多长,Set-Cookie 让浏览器保存会话,Cache-Control 控制缓存策略。响应体才是我们真正要用的数据,常见的有 JSON、HTML、图片或文件流。

四、动手写一段请求代码

先用 Python 发请求并打印状态码和 JSON:

import requests

resp = requests.get("https://example.com/api/hello", timeout=5)
print(resp.status_code)      # 200 表示成功
print(resp.headers.get("Content-Type"))
print(resp.json())

再用 JavaScript 的 fetch 写一遍,注意要判断 resp.ok,因为 fetch 只有网络失败才会抛错,404、500 也会正常返回一个 Response:

const resp = await fetch("https://example.com/api/hello");
if (!resp.ok) {
  throw new Error(`请求失败:${resp.status} ${resp.statusText}`);
}
const data = await resp.json();
console.log(data);

如果你在本地练习,可以用 Python 一行起一个静态服务器:python -m http.server 8000,然后在浏览器打开 http://localhost:8000,再用浏览器开发者工具的“网络”面板观察每一次请求和响应。这是最直观的学习方式。

五、新手最容易踩的五个坑

第一,把 GET 当成万能方法:查询用 GET,提交数据用 POST,别把敏感信息放在 URL 里,因为 URL 会进日志和浏览器历史。第二,只看响应体不看状态码:接口返回 200 但业务失败很常见,好的接口会在响应体里再给一个业务码。第三,忽略 Content-Type:发 JSON 一定要设置 application/json,否则服务器可能按表单解析。第四,忘了处理超时和重试:网络请求必须设超时,失败重试要有次数上限和退避间隔。第五,把 HTTP 当成安全协议:明文 HTTP 会被窃听和篡改,生产环境一律用 HTTPS。

六、小结与练习

记住这条主线就够了:客户端按“方法 + URL + 请求头 + 请求体”发请求,服务器按“状态码 + 响应头 + 响应体”回响应。状态码先定性,响应头再定细节,响应体最后才是数据。

留两个小练习:第一,用 curl 请求一个公开接口,对照本文说出它的状态码、Content-Type 和响应体结构;第二,把上面的 Python 或 JavaScript 代码改成 POST 请求,提交一段 JSON 并打印服务器回显。做完这两步,HTTP 的第一课就算真正过关了,下一课我们可以继续聊 HTTPS、缓存和 Cookie。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。