17.Python的网络编程基础:从Socket到API实战

85 阅读3分钟

@[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()

运行说明

  1. 先启动 server.py,再运行 client.py
  2. 输入消息即可双向通信(按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设计原则 ⭐️

核心原则

  1. 资源导向:用名词而非动词定义端点(如/books而非/get_books
  2. HTTP方法明确
    • GET:获取资源
    • POST:创建资源
    • PUT:更新资源
    • DELETE:删除资源
  3. 状态码标准化
    • 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工具

功能设计

  1. 用户输入城市名
  2. 调用天气API获取数据
  3. 解析并显示温度、天气状况
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网络编程三大核心:

  1. Socket通信:理解TCP/UDP底层协议
  2. HTTP请求:掌握requests库高效访问Web API
  3. RESTFUL设计:遵循资源化、无状态原则构建API

下期预告
18. Python的代码质量与工程规范:从规范到测试实战

更多技术干货欢迎关注微信公众号“科威舟的AI笔记”~

【转载须知】:转载请注明原文出处及作者信息