Python内置模块之http详细功能介绍及示例

Python中的http模块及其使用方法

Python标准库中的http模块是一个底层的HTTP协议包,提供了HTTP客户端和服务器的基本功能。它包含几个子模块,最常用的是http.clienthttp.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)

实际应用场景

  1. API调用:使用http.client与REST API交互
  2. 快速测试服务器:使用http.server快速搭建本地测试服务器
  3. 原型开发:快速实现HTTP服务原型
  4. 爬虫开发:低级别的HTTP请求处理

注意事项

  1. 对于生产环境,建议使用更高级的库如requests(客户端)或Flask/Django(服务器)
  2. http.server不适合生产环境,仅用于开发和测试
  3. 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客户端类,处理连接管理、请求发送和响应解析。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值