1.HTTP基础概述 - 介绍HTTP的核心概念和特点
HTTP (HyperText Transfer Protocol) 是一种用于传输超媒体文档的应用层协议。
它是Web的基础,定义了客户端和服务器之间的请求-响应模型。
核心特点:
无状态: 每个请求都是独立的,服务器不会 记住之前的请求
基于TCP/IP: 使用TCP作为传输层协议,确保数据可靠传输
请求-响应模型: 客户端发送请求,服务器返回响应
可扩展: 通过HTTP头信息支持扩展功能
2.HTTP请求与响应结构 - 详细解析请求和响应的组成部分
HTTP请求 由三部分组成:
请求行: 包含方法、URL和协议版本
请求头: 包含客户端信息、请求参数等
请求体: 包含请求数据(如表单、JSON等)
示例请求:GET /api/users HTTP/1.1(请求方法+URL+协议版本)
Host: example.com (请求头)
User-Agent: Mozilla/5.0 (请求头)
Accept: application/json (请求头)
{"name": "John", "email": "john@example.com"} 请求体 ,请求体内容:{名字:John ,邮件:john@example.com}
HTTP响应 由三部分组成:
状态行: 包含协议版本、状态码和状态消息
响应头: 包含服务器信息、响应参数等
响应体: 包含响应数据(如HTML、JSON等)
示例响应:HTTP/1.1 200 OK (协议版本+状态码)
Content-Type: application/json (响应头)
Content-Length: 42 (响应头)
Server: Apache/2.4.41 (响应头)
{"id": 1, "name": "John", "email": "john@example.com"} (响应体)
3.HTTP方法 - 全面讲解GET、POST、PUT等方法的用途
HTTP定义了多种请求方法,用于指示对资源的操作:
|---------|----------------|
| GET | 获取资源 |
| POST | 提交新资源 |
| PUT | 更新现有资源 |
| PATCH | 部分更新资源 |
| DELETE | 删除资源 |
| HEAD | 获取资源头信息,不返回响应体 |
| OPTIONS | 获取服务器支持的HTTP方法 |
| CONNECT | 建立网络连接隧道 |
| TRACE | 追踪请求-响应的传输路径 |
4.HTTP状态码 - 分类说明1xx到5xx状态码的含义
状态码表示服务器对请求的处理结果,分为5类:
1xx - 信息性状态码
100 Continue: 服务器已接收请求头,客户端可继续发送请求体
2xx - 成功状态码200 OK: 请求成功
201 Created: 请求已成功创建资源
204 No Content: 请求成功,但无响应体 。
3xx - 重定向状态码301 Moved Permanently: 资源已永久移动
302 Found: 资源临时移动
304 Not Modified: 资源未修改,可使用缓存
4xx - 客户端错误状态码400 Bad Request: 请求格式错误
401 Unauthorized: 请求需要身份验证
403 Forbidden: 服务器拒绝请求
404 Not Found: 资源未找到405 Method Not Allowed: 请求方法不被允许
5xx - 服务器错误状态码500 Internal Server Error: 服务器内部 错误
501 Not Implemented: 服务器不支持该请 求功能
502 Bad Gateway: 网关错误
503 Service Unavailable: 服务器暂时不 可用
504 Gateway Timeout: 网关超时
5.HTTP头信息 - 介绍常用请求头和响应头
HTTP头包含请求或响应的元数据,分为通用头 、请求头、响应头和实体头。
常用请求头:
User-Agent: 客户端浏览器或工具信息
Accept: 客户端可接受的响应格式
Content-Type: 请求体的媒体类型
Authorization: 身份验证信息
Cookie: 客户端存储的Cookie
常用响应头:Content-Type: 响应体的媒体类型
Content-Length: 响应体的长度
Server: 服务器软件信息
Set-Cookie: 服务器设置的Cookie
Cache-Control: 缓存控制策略
6.URL结构 - 解析URL的各个组成部分
URL (Uniform Resource Locator) 用于定位网络资源,结构如下:
协议://域名:端口/路径?查询参数#片段
示例: https://example.com:443/api/users?id=123#profile
协议: https
域名: example.com
端口: 443
路径: /api/users
查询参数: id=123
片段: profile
7.Python实现HTTP请求 - 使用requests库的实战示例
7.1GET请求示例
Python中常用requests库来发送HTTP请求,功能强大且易于使用。
代码:
print("7.1 GET请求示例:")
try:
response = requests.get('https://httpbin.org/get', params={'name': 'Python', 'version': '3.10'})
print(f"请求URL: {response.url}")
print(f"状态码: {response.status_code}")
# 只显示前3个头部
headers_dict = dict(response.headers)
print(f"响应头: {list(headers_dict.items())[:3]}...")
print(f"响应体: {response.json()}")
print()
except Exception as e:
print(f"请求失败: {e}")
print()
结果:
请求URL: https://httpbin.org/get?name=Python&version=3.10
状态码: 200
响应头: [('Date', 'Fri, 09 Jan 2026 05:37:45 GMT'), ('Content-Type', 'application/json'), ('Content-Length', '380')]...
响应体: {'args': {'name': 'Python', 'version': '3.10'}, 'headers': {'Accept': '*/*', 'Accept-Encoding': 'gzip, deflate', 'Host': 'httpbin.org', 'User-Agent': 'python-requests/2.31.0', 'X-Amzn-Trace-Id': 'Root=1-69609429-405157934b51d91f15a868ff'}, 'origin': '123.52.24.248', 'url': 'https://httpbin.org/get?name=Python&version=3.10'}
状态码: 200
响应体: {'args': {}, 'data': '{"name": "John Doe", "email": "john@example.com"}',
'files': {}, 'form': {}, 'headers': {'Accept': '*/*', 'Accept-Encoding': 'gzip, deflate', 'Content-Length': '49', 'Content-Type': 'application/json', 'Host': 'httpbin.org', 'User-Agent': 'python-requests/2.31.0', 'X-Amzn-Trace-Id': 'Root=1-6960942c-3140f153121bc2020569feeb'}, 'json': {'email': 'john@example.com', 'name': 'John Doe'}, 'origin': '123.52.24.248', 'url': 'https://httpbin.org/post'}
请求URL: https://httpbin.org/get?name=Python\&version=3.10,其中:
https:协议
参数:name=Python&version=3.10
7.2 POST请求示例
代码:
print("7.2 POST请求示例:")
try:
# JSON数据
data = {'name': 'John Doe', 'email': 'john@example.com'}
response = requests.post('https://httpbin.org/post', json=data)
print(f"状态码: {response.status_code}")
print(f"响应体: {response.json()}")
print()
except Exception as e:
print(f"请求失败: {e}")
print()
运行结果:
状态码: 200
响应体: {'args': {}, 'data': '{"name": "John Doe", "email": "john@example.com"}',
'files': {}, 'form': {}, 'headers': {'Accept': '*/*', 'Accept-Encoding': 'gzip, deflate', 'Content-Length': '49', 'Content-Type': 'application/json', 'Host': 'httpbin.org', 'User-Agent': 'python-requests/2.31.0', 'X-Amzn-Trace-Id': 'Root=1-6960942c-3140f153121bc2020569feeb'}, 'json': {'email': 'john@example.com', 'name': 'John Doe'}, 'origin': '123.52.24.248', 'url': 'https://httpbin.org/post'}
7.3 自定义请求头
代码:
print("7.3 自定义请求头:")
try:
headers = {
'User-Agent': 'Python-HTTP-Client/1.0',
'Content-Type': 'application/json',
'Authorization': 'Bearer token123'
}
response = requests.get('https://httpbin.org/headers', headers=headers)
print(f"响应头: {response.json()['headers']}")
print()
except Exception as e:
print(f"请求失败: {e}")
print()
运行结果:
响应头: {'Accept': '*/*', 'Accept-Encoding': 'gzip, deflate', 'Authorization': 'Bearer token123', 'Content-Type': 'application/json', 'Host': 'httpbin.org', 'User-Agent': 'Python-HTTP-Client/1.0', 'X-Amzn-Trace-Id': 'Root=1-69609430-792c5d4566f41d05136663b5'}
8.API调用实战 - 使用JSONPlaceholder公共API的完整示例
8.1 调用公共API (JSONPlaceholder)
代码:
print("8.1 调用公共API (JSONPlaceholder):")
try:
# 获取所有用户
users_response = requests.get('https://jsonplaceholder.typicode.com/users')
users = users_response.json()
print(f"获取到 {len(users)} 个用户")
print(f"第一个用户: {users[0]['name']} ({users[0]['email']})")
print()
# 创建新帖子
post_data = {
'title': 'Python HTTP Guide',
'body': 'This is a guide to HTTP in Python',
'userId': 1
}
post_response = requests.post('https://jsonplaceholder.typicode.com/posts', json=post_data)
print(f"创建帖子响应: {post_response.json()}")
print()
# 更新帖子
update_data = {
'title': 'Updated Python HTTP Guide'
}
update_response = requests.patch('https://jsonplaceholder.typicode.com/posts/1', json=update_data)
print(f"更新帖子响应: {update_response.json()}")
print()
# 删除帖子
delete_response = requests.delete('https://jsonplaceholder.typicode.com/posts/1')
print(f"删除帖子状态码: {delete_response.status_code}")
print()
except Exception as e:
print(f"API调用失败: {e}")
运行结果:
8.1 调用公共API (JSONPlaceholder):
获取到 10 个用户
第一个用户: Leanne Graham (Sincere@april.biz)
创建帖子响应: {'title': 'Python HTTP Guide', 'body': 'This is a guide to HTTP in Python', 'userId': 1, 'id': 101}
更新帖子响应: {'userId': 1, 'id': 1, 'title': 'Updated Python HTTP Guide', 'body': 'quia et suscipit\nsuscipit recusandae consequuntur expedita et cum\nreprehenderit molestiae ut ut quas totam\nnostrum rerum est autem sunt rem eveniet architecto'}
删除帖子状态码: 200
8.2 处理不同响应格式
代码:
print("8.2 处理不同响应格式:")
try:
# JSON响应
json_response = requests.get('https://httpbin.org/json')
print(f"JSON响应类型: {json_response.headers['Content-Type']}")
print(f"JSON数据: {json_response.json()['slideshow']['title']}")
print()
# 文本响应
text_response = requests.get('https://httpbin.org/robots.txt')
print(f"文本响应类型: {text_response.headers['Content-Type']}")
print(f"文本内容: {text_response.text[:100]}...")
print()
# 二进制响应
binary_response = requests.get('https://httpbin.org/image/png')
print(f"二进制响应类型: {binary_response.headers['Content-Type']}")
print(f"二进制数据长度: {len(binary_response.content)} 字节")
print()
except Exception as e:
print(f"处理响应失败: {e}")
print()
运行结果:
8.2 处理不同响应格式:
JSON响应类型: application/json
JSON数据: Sample Slide Show
文本响应类型: text/plain
文本内容: User-agent: *
Disallow: /deny
...
二进制响应类型: image/png
二进制数据长度: 8090 字节
9.高级HTTP功能 - 会话管理、超时设置、异常处理
9.1 会话管理
代码:
print("10.1 会话管理:")
try:
# 创建会话对象
session = requests.Session()
# 设置会话级别的请求头
session.headers.update({'User-Agent': 'Python-Session-Client/1.0'})
# 发送第一个请求
response1 = session.get('https://httpbin.org/cookies/set', params={'sessionid': '123456'})
print(f"设置Cookie响应: {response1.json()}")
# 发送第二个请求,会自动带上Cookie
response2 = session.get('https://httpbin.org/cookies')
print(f"获取Cookie响应: {response2.json()}")
print()
except Exception as e:
print(f"会话管理失败: {e}")
print()
运行结果:
10. 高级 HTTP 功能
----------------------------------------
10.1 会话管理:
设置Cookie响应: {'cookies': {'sessionid': '123456'}}
获取Cookie响应: {'cookies': {'sessionid': '123456'}}
9.2 超时设置
代码:
print("9.2 超时设置:")
try:
# 设置超时时间
response = requests.get('https://httpbin.org/delay/2', timeout=3)
print(f"超时测试成功: {response.status_code}")
print()
except requests.Timeout:
print("请求超时!")
print()
except Exception as e:
print(f"其他错误: {e}")
print()
运行结果:
10.2 超时设置:
超时测试成功: 200
9.3 异常处理
代码:
print("9.3 异常处理:")
try:
response = requests.get('https://nonexistent-domain-12345.com')
response.raise_for_status() # 抛出HTTP错误
print(f"请求成功: {response.status_code}")
except requests.ConnectionError:
print("连接错误: 无法连接到服务器")
except requests.Timeout:
print("超时错误: 请求超时")
except requests.HTTPError as e:
print(f"HTTP错误: {e}")
except Exception as e:
print(f"其他错误: {e}")
print()
运行结果:
10.3 异常处理:
连接错误: 无法连接到服务器
10.HTTPS协议 - 讲解HTTPS的安全特性
HTTPS (HTTP Secure) 是HTTP的安全版本,使用SSL/TLS加密传输数据。
核心特点:
数据加密: 使用SSL/TLS加密客户端和服务器之间的数据传输
身份验证: 服务器通过SSL证书证明自己的身份
数据完整性: 确保数据在传输过程中不被篡改
HTTPS URL格式: https://example.com
代码:
print("HTTPS请求示例:")
try:
response = requests.get('https://www.baidu.com')
print(f"状态码: {response.status_code}")
print(f"网站标题: {response.text[:500]}...")
print()
except Exception as e:
print(f"HTTPS请求失败: {e}")
print()
运行结果:
HTTPS请求示例:
状态码: 200
网站标题: <!DOCTYPE html>
<!--STATUS OK--><html> <head><meta http-equiv=content-type content=text/html;charset=utf-8><meta http-equiv=X-UA-Compatible content=IE=Edge><meta content=always name=referrer><link rel=stylesheet type=text/css href=https://ss1.bdstatic.com/5eN1bjq8AAUYm2zgoY3K/r/www/cache/bdorz/baidu.min.css><title>ç¾åº¦ä¸ä¸ï¼ä½ å°±çé<
/title></head> <body link=#0000cc> <div id=wrapper> <div id=head> <div class=head_wrapper> <div class=s_form> <div class=s_form_wrapper> <div id=lg> <img h...
11.RESTful API设计原则 - 介绍RESTful API的最佳实践
REST (Representational State Transfer) 是一种API设计风格,遵循以下原则:
- 资源为中心: 使用URL表示资源
示例: /users, /posts/123
- 使用HTTP方法表示操作:
GET /users - 获取所有用户
POST /users - 创建新用户
GET /users/1 - 获取特定用户
PUT /users/1 - 更新特定用户
DELETE /users/1 - 删除特定用户
无状态: 每个请求都包含完整的状态信息
统一接口: 使用标准的HTTP方法和状态码
资源表示: 使用JSON或XML表示资源
12.HTTP服务器搭建 - 如何使用Python内置模块快速搭建服务器
Python内置了简单的HTTP服务器模块,可以快速搭建测试服务器。
命令行启动HTTP服务器:
命令1:python -m http.server 8000
命令2:python -m SimpleHTTPServer 8000
启动后可通过 http://localhost:8000 访问
注意:
命令1适用于python3.0版本以上
命令2适用于python2.0版本以上
命令行启动:按 Ctrl + C 关闭服务器
13.常见错误和注意事项 - 避免HTTP开发中的常见问题
404 Not Found: 检查URL是否正确,资源是否存在
401 Unauthorized: 检查身份验证信息是否正确
403 Forbidden: 检查是否有权限访问该资 源
500 Internal Server Error: 服务器内部 错误,联系服务器管理员
连接超时: 检查网络连接,增加超时时间
编码问题: 确保正确处理响应编码
数据格式: 确保请求体格式与Content-Type一致
安全问题: 不要在URL中传递敏感信息,使 用HTTPS加密传输
15.面试习题
一、选择题
HTTP协议是基于哪个协议之上的?
A. UDP
B. TCP
C. IP
D. HTTP/2
**B. TCP**
以下哪个HTTP方法用于获取资源?A. POST
B. GET
C. PUT
D. DELETE
**B. GET**
HTTP协议的默认端口号是:
A. 80
B. 443
C. 8080
D. 21
**A. 80**
HTTP状态码200表示:A. 请求成功
B. 请求重定向
C. 请求错误
D. 服务器错误
**A. 请求成功**
以下哪个状态码表示客户端请求的资源不存在?A. 200
B. 301
C. 404
D. 500
**C. 404**
二、判断题
HTTP协议是无状态的,即每个请求都是独立的。(对/错)
HTTP/2相比HTTP/1.1引入了头部压缩和多路复用等特性。(对/错)
HTTPS协议在HTTP协议的基础上增加了SSL/TLS层,用于加密通信。(对/错)
HTTP请求报文包含请求行、请求头和请求体。(对/错)
HTTP响应报文包含状态行、响应头和响应体。(对/错)
**HTTP协议是无状态的,即每个请求都是独立的。(对/错)****对**
**HTTP/2相比HTTP/1.1引入了头部压缩和多路复用等特性。(对/错)**
**对**
**HTTPS协议在HTTP协议的基础上增加了SSL/TLS层,用于加密通信。(对/错)**
**对**
**HTTP请求报文包含请求行、请求头和请求体。(对/错)**
**对**
**HTTP响应报文包含状态行、响应头和响应体。(对/错)**
**对**
三、简答题
简述HTTP协议的工作原理。
HTTP是一种应用层协议,用于在Web服务器和客户端之间传输超文本数据。它的工作原理基于请求/响应模型:客户端(如浏览器)发送一个HTTP请求到服务器,服务器处理请求并返回一个HTTP响应。这个响应包含了所请求的数据(如HTML文档、图片等)或者错误信息。
解释HTTP状态码301和302的区别。
HTTP状态码301表示永久重定向,意味着请求的资源已被永久移动到新位置,客户端应使用Location头指定的新URI进行以后的请求。302表示临时重定向,资源临时被移动到另一个URI,客户端在本次请求中使用新URI,但在未来的请求中仍应使用原URI。
什么是HTTP请求方法?请列举常见的HTTP请求方法并简要说明其用途。
**GET**:请求从服务器检索特定资源。是最常用的方法。**POST**:向服务器提交数据进行处理请求(例如提交表单或上传文件)。数据被包含在请求体中。
**PUT**:上传指定资源,请求服务器存储资源。
**DELETE**:请求服务器删除指定的资源。
**HEAD**:请求获取与GET请求相同的响应,但没有响应体。
什么是HTTP头信息?请列举常见的HTTP请求头和响应头字段。
**请求头**:
`User-Agent`:发出请求的浏览器或客户端标识。
`Accept`:客户端能够处理的媒体类型。
`Host`:请求的服务器的域名。
`Content-Type`:请求体的媒体类型。
`Authorization`:认证信息,用于访问受保护的资源。
**响应头**:
`Content-Type`:响应体的媒体类型。
`Set-Cookie`:服务器向客户端设置cookie。
`Location`:用于重定向的URI。
`Server`:服务器软件名称。
简述HTTPS协议与HTTP协议的区别。
HTTPS是HTTP的安全版本,它在HTTP的基础上通过SSL/TLS协议提供了数据加密、完整性校验和身份验证。这意味着HTTPS可以保护交换的数据免受窃听和篡改,并确保数据是从一个真实的服务器发送的。主要区别在于HTTPS在传输层使用SSL/TLS进行加密,而HTTP不提供这样的加密。