Python中的http模块及其使用方法
Python标准库中的http
模块是一个底层的HTTP协议包,提供了HTTP客户端和服务器的基本功能。它包含几个子模块,最常用的是http.client
和http.server
。
主要子模块和方法
1. http.client (HTTP客户端)
这是实现HTTP/1.1协议的底层客户端接口。
主要方法:
HTTPConnection(host, port[, timeout])
- 创建HTTP连接HTTPSConnection(host, port[, timeout])
- 创建HTTPS连接request(method, url, body=None, headers={})
- 发送请求getresponse()
- 获取响应response.read()
- 读取响应内容response.status
- 获取HTTP状态码response.reason
- 获取状态码描述response.getheaders()
- 获取所有响应头response.getheader(name, default=None)
- 获取特定响应头
示例:发送GET请求
import http.client
# 创建连接
conn = http.client.HTTPSConnection("www.example.com")
# 发送GET请求
conn.request("GET", "/")
# 获取响应
response = conn.getresponse()
# 输出响应状态和原因
print("Status:", response.status, response.reason)
# 输出响应头
print("Headers:")
for header, value in response.getheaders():
print(f"{header}: {value}")
# 输出响应内容
print("\nContent:")
print(response.read().decode('utf-8'))
# 关闭连接
conn.close()
示例:发送POST请求
import http.client
import json
conn = http.client.HTTPSConnection("jsonplaceholder.typicode.com")
headers = {'Content-type': 'application/json'}
# POST数据
post_data = {
'title': 'foo',
'body': 'bar',
'userId': 1
}
# 发送POST请求
conn.request("POST", "/posts", body=json.dumps(post_data), headers=headers)
response = conn.getresponse()
print(response.status, response.reason)
print(response.read().decode())
conn.close()
2. http.server (HTTP服务器)
这是一个简单的HTTP服务器实现,可用于测试或开发目的。
主要类:
HTTPServer(server_address, RequestHandlerClass)
- 基本HTTP服务器BaseHTTPRequestHandler
- 请求处理程序基类SimpleHTTPRequestHandler
- 简单的文件服务请求处理程序
示例:创建简单HTTP服务器
from http.server import HTTPServer, SimpleHTTPRequestHandler
# 设置服务器地址和端口
server_address = ('', 8000) # 空字符串表示所有可用接口
# 创建HTTP服务器
httpd = HTTPServer(server_address, SimpleHTTPRequestHandler)
print("Serving HTTP on port 8000...")
httpd.serve_forever()
示例:自定义请求处理程序
from http.server import BaseHTTPRequestHandler, HTTPServer
class MyHandler(BaseHTTPRequestHandler):
def do_GET(self):
self.send_response(200)
self.send_header('Content-type', 'text/html')
self.end_headers()
self.wfile.write(b"<html><body><h1>Hello, World!</h1></body></html>")
server_address = ('', 8000)
httpd = HTTPServer(server_address, MyHandler)
print("Starting custom server on port 8000...")
httpd.serve_forever()
3. http.cookies (Cookie处理)
用于处理HTTP cookies。
示例:
from http import cookies
# 创建Cookie
c = cookies.SimpleCookie()
c['mycookie'] = 'cookie_value'
c['mycookie']['domain'] = 'example.com'
c['mycookie']['path'] = '/'
c['mycookie']['max-age'] = 3600
# 输出HTTP头
print(c.output())
# 解析Cookie
header_cookie = "mycookie=cookie_value; name2=value2"
c = cookies.SimpleCookie()
c.load(header_cookie)
for key, morsel in c.items():
print(key, morsel.value)
实际应用场景
- API调用:使用
http.client
与REST API交互 - 快速测试服务器:使用
http.server
快速搭建本地测试服务器 - 原型开发:快速实现HTTP服务原型
- 爬虫开发:低级别的HTTP请求处理
注意事项
- 对于生产环境,建议使用更高级的库如
requests
(客户端)或Flask
/Django
(服务器) http.server
不适合生产环境,仅用于开发和测试http.client
是较低级别的接口,需要手动处理许多细节
高级示例:REST API客户端
import http.client
import json
class APIClient:
def __init__(self, host, port=443, timeout=10):
self.host = host
self.port = port
self.timeout = timeout
self.conn = None
def connect(self):
self.conn = http.client.HTTPSConnection(
self.host,
port=self.port,
timeout=self.timeout
)
def request(self, method, endpoint, data=None, headers=None):
if not self.conn:
self.connect()
default_headers = {'Content-type': 'application/json'}
if headers:
default_headers.update(headers)
body = json.dumps(data) if data else None
self.conn.request(method, endpoint, body=body, headers=default_headers)
response = self.conn.getresponse()
response_data = response.read().decode()
return {
'status': response.status,
'reason': response.reason,
'headers': dict(response.getheaders()),
'data': json.loads(response_data) if response_data else None
}
def close(self):
if self.conn:
self.conn.close()
self.conn = None
# 使用示例
client = APIClient("jsonplaceholder.typicode.com")
try:
# 获取所有帖子
response = client.request("GET", "/posts")
print("GET Response:", response['status'], response['reason'])
print("First post:", response['data'][0])
# 创建新帖子
new_post = {
'title': 'foo',
'body': 'bar',
'userId': 1
}
response = client.request("POST", "/posts", data=new_post)
print("\nPOST Response:", response['status'], response['reason'])
print("Created post:", response['data'])
finally:
client.close()
这个示例展示了如何封装http.client
来创建一个简单的REST API客户端类,处理连接管理、请求发送和响应解析。