@[toc]
Python的网络编程基础:从Socket到API实战
本文面向初/中级Python开发者,系统讲解网络编程的核心技术:Socket通信、HTTP请求库(requests)、RESTful API设计原则,并通过天气查询CLI工具实战巩固知识。代码示例丰富,建议边阅读边调试。
1. Socket通信:网络编程的基石
原理浅析
Socket是进程间通信的端点,基于TCP/IP协议工作。分为两类:
- TCP Socket:可靠传输(如打电话),保证数据顺序和完整性
- UDP Socket:高速传输(如发短信),可能丢包但实时性高
实战:简易TCP聊天室
服务器端代码(保存为 server.py):
import socket
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(('localhost', 9999))
server_socket.listen(5) # 允许最多5个客户端排队
print("服务器启动,等待连接...")
while True:
client_socket, addr = server_socket.accept() # 阻塞等待连接
print(f"客户端 {addr} 已连接")
try:
while True:
data = client_socket.recv(1024).decode('utf-8') # 接收数据
if not data:
break
print(f"客户端说: {data}")
reply = input("服务器回复: ")
client_socket.send(reply.encode('utf-8'))
finally:
client_socket.close() # 关闭连接
客户端代码(保存为 client.py):
import socket
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect(('localhost', 9999))
try:
while True:
msg = input("客户端输入: ")
client_socket.send(msg.encode('utf-8'))
response = client_socket.recv(1024).decode('utf-8')
print(f"服务器回复: {response}")
except KeyboardInterrupt:
print("连接关闭")
finally:
client_socket.close()
运行说明:
- 先启动
server.py,再运行client.py - 输入消息即可双向通信(按
Ctrl+C退出)
2. HTTP请求(requests库)
为何选择requests?
相比Python内置的urllib,requests的API更简洁,支持会话保持、超时重试等高级功能。
实战:调用天气API
import requests
def get_weather(city):
url = "http://api.weatherapi.com/v1/current.json"
params = {
"key": "YOUR_API_KEY", # 替换为真实Key(注册免费)
"q": city,
"aqi": "no"
}
try:
response = requests.get(url, params=params, timeout=5)
response.raise_for_status() # 自动检查HTTP错误
data = response.json()
return f"{city}天气:{data['current']['condition']['text']},温度:{data['current']['temp_c']}℃"
except requests.exceptions.RequestException as e:
return f"请求失败: {e}"
print(get_weather("Beijing"))
关键技巧:
timeout=5:避免请求卡死response.json():自动解析JSON响应raise_for_status():非200状态码时抛出异常
3. RESTFUL API设计原则 ⭐️
核心原则:
- 资源导向:用名词而非动词定义端点(如
/books而非/get_books) - HTTP方法明确:
GET:获取资源POST:创建资源PUT:更新资源DELETE:删除资源
- 状态码标准化:
200 OK:成功404 Not Found:资源不存在500 Internal Server Error:服务器错误
实战:用Flask创建书籍API
from flask import Flask, jsonify, request
app = Flask(__name__)
books = [
{"id": 1, "title": "Python编程:从入门到实践"},
{"id": 2, "title": "深入理解计算机系统"}
]
@app.route('/books', methods=['GET'])
def get_books():
return jsonify({"books": books})
@app.route('/books', methods=['POST'])
def add_book():
new_book = request.json
books.append(new_book)
return jsonify({"message": "书籍添加成功"}), 201
if __name__ == '__main__':
app.run(debug=True)
测试命令(使用curl):
curl -X GET http://localhost:5000/books # 获取书籍列表
curl -X POST -H "Content-Type: application/json" -d '{"id":3, "title":"Clean Code"}' http://localhost:5000/books
4. 综合实战:天气查询CLI工具
功能设计:
- 用户输入城市名
- 调用天气API获取数据
- 解析并显示温度、天气状况
import requests
import argparse
def fetch_weather(api_key, city):
url = "http://api.weatherapi.com/v1/current.json"
params = {"key": api_key, "q": city}
response = requests.get(url, params=params)
data = response.json()
return data
def display_weather(data):
location = data["location"]["name"]
condition = data["current"]["condition"]["text"]
temp = data["current"]["temp_c"]
print(f"{location} | {condition} | {temp}°C")
if __name__ == "__main__":
parser = argparse.ArgumentParser(description="天气查询工具")
parser.add_argument("city", help="城市名称(例如:'Beijing')")
args = parser.parse_args()
API_KEY = "YOUR_API_KEY" # 替换为真实Key
weather_data = fetch_weather(API_KEY, args.city)
display_weather(weather_data)
运行示例:
python weather_cli.py Shanghai
# 输出:Shanghai | Sunny | 28°C
总结 本文覆盖了Python网络编程三大核心:
- Socket通信:理解TCP/UDP底层协议
- HTTP请求:掌握requests库高效访问Web API
- RESTFUL设计:遵循资源化、无状态原则构建API
下期预告:
18. Python的代码质量与工程规范:从规范到测试实战
更多技术干货欢迎关注微信公众号“科威舟的AI笔记”~
【转载须知】:转载请注明原文出处及作者信息