Python如何实现 HTTP echo 服务器

在 Python 中实现一个简单的 HTTP Echo 服务器,你可以使用内置的 http.server 模块,或者通过更底层的 socket 库来实现。这里,我们分别展示这两种方法。

图片[1]_Python如何实现 HTTP echo 服务器_知途无界

方法一:使用 http.server 模块

Python 的 http.server 模块提供了一个简单的 HTTP 服务器实现,可以很方便地用来创建一个 Echo 服务器。你可以通过创建一个自定义的请求处理器来实现 Echo 功能。

from http.server import BaseHTTPRequestHandler, HTTPServer

class EchoRequestHandler(BaseHTTPRequestHandler):
    def do_GET(self):
        # 获取请求的路径和查询参数
        length = int(self.headers.get('Content-Length', 0))
        query_string = self.path.split('?')[1] if '?' in self.path else ''
        
        # 发送响应状态码
        self.send_response(200)
        
        # 发送响应头
        self.send_header('Content-type', 'text/plain')
        self.end_headers()
        
        # 发送响应内容,这里简单地将查询参数回显
        response = f"Echo: {query_string}\n"
        self.wfile.write(response.encode())

    def do_POST(self):
        # 获取请求体内容
        length = int(self.headers.get('Content-Length', 0))
        post_data = self.rfile.read(length)
        
        # 发送响应状态码
        self.send_response(200)
        
        # 发送响应头
        self.send_header('Content-type', 'text/plain')
        self.end_headers()
        
        # 发送响应内容,这里将请求体内容回显
        response = f"Echo: {post_data.decode()}\n"
        self.wfile.write(response.encode())

def run(server_class=HTTPServer, handler_class=EchoRequestHandler, port=8080):
    server_address = ('', port)
    httpd = server_class(server_address, handler_class)
    print(f"Starting httpd server on port {port}")
    httpd.serve_forever()

if __name__ == "__main__":
    run()

方法二:使用 socket 库

如果你希望更低级别地控制 HTTP 交互,可以使用 socket 库来手动处理 HTTP 请求和响应。以下是一个简单的实现:

import socket

def handle_request(client_socket):
    # 接收请求数据
    request_data = client_socket.recv(1024).decode('utf-8')
    print(request_data)
    
    # 解析请求行和头部
    request_lines = request_data.split('\r\n')
    request_line = request_lines[0]
    headers = request_lines[1:]
    
    method, path, _ = request_line.split(' ')
    query_string = path.split('?')[1] if '?' in path else ''
    
    # 构造响应
    status_line = 'HTTP/1.1 200 OK\r\n'
    headers_str = 'Content-type: text/plain\r\n\r\n'
    response_body = f"Echo: {query_string}\n"
    
    response = status_line + headers_str + response_body
    
    # 发送响应
    client_socket.sendall(response.encode('utf-8'))
    client_socket.close()

def run(host='127.0.0.1', port=8080):
    server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server_socket.bind((host, port))
    server_socket.listen(5)
    print(f"Starting socket server on {host}:{port}")
    
    while True:
        client_socket, addr = server_socket.accept()
        print(f"Accepted connection from {addr}")
        handle_request(client_socket)

if __name__ == "__main__":
    run()

运行服务器

将上述代码保存为一个 Python 文件(例如 echo_server.py),然后在终端运行:

python echo_server.py

服务器将在指定的端口(默认是 8080)上运行,并等待 HTTP 请求。你可以通过浏览器或 curl 发送请求来测试服务器:

curl "http://localhost:8080/?hello=world"
# 或者使用 POST 请求
curl -X POST -d "message=hello" http://localhost:8080/

这两个示例展示了如何使用不同的方法实现一个简单的 HTTP Echo 服务器。选择哪种方法取决于你的需求和偏好。

© 版权声明
THE END
喜欢就点个赞,支持一下吧!
点赞7 分享
评论 抢沙发
头像
欢迎您留下评论!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容