from http.server import HTTPServer, BaseHTTPRequestHandler import json import threading import urllib # "数据库" 和线程锁保持不变 WORKFLOWS_DB = {} db_lock = threading.Lock() class SimpleAPIHandler(BaseHTTPRequestHandler): def _send_cors_headers(self): self.send_header('Access-Control-Allow-Origin', '*') self.send_header('Access-Control-Allow-Methods', 'GET, POST, DELETE, OPTIONS') # 添加 DELETE self.send_header("Access-Control-Allow-Headers", "X-Requested-With, Content-Type") def do_OPTIONS(self): self.send_response(200, "ok") self._send_cors_headers() self.end_headers() def do_GET(self): # ... (do_GET 保持不变) ... if self.path == '/api/workflow': self.send_response(200) self.send_header('Content-type', 'application/json') self._send_cors_headers() self.end_headers() with db_lock: response_data = list(WORKFLOWS_DB.values()) self.wfile.write(json.dumps(response_data).encode()) else: self.send_response(404) self.end_headers() self.wfile.write(b'Not Found') def do_POST(self): # ... (do_POST 保持不变) ... if self.path == '/api/workflow': content_length = int(self.headers['Content-Length']) post_data = self.rfile.read(content_length) try: data = json.loads(post_data) name = data.get('name') workflow_data = data.get('workflow') if not name or not workflow_data: raise ValueError("Missing 'name' or 'workflow' in request body") with db_lock: WORKFLOWS_DB[name] = {"name": name, "workflow": workflow_data} print(f"--- Received/Updated workflow: {name} ---") self.send_response(200) self.send_header('Content-type', 'application/json') self._send_cors_headers() self.end_headers() self.wfile.write(json.dumps({"status": "received", "name": name}).encode()) except Exception as e: self.send_response(400); self.end_headers(); self.wfile.write(f'Bad Request: {e}'.encode()) else: self.send_response(404); self.end_headers(); self.wfile.write(b'Not Found') # --- [核心新增] 添加 do_DELETE 方法 --- def do_DELETE(self): """处理删除指定工作流的请求""" # 我们期望的路径格式: /api/workflow/工作流名称[版本号] parts = self.path.split('/api/workflow/') if len(parts) == 2 and parts[1]: # URL解码工作流名称,因为它可能包含空格等特殊字符 workflow_name_to_delete = urllib.parse.unquote(parts[1]) with db_lock: if workflow_name_to_delete in WORKFLOWS_DB: del WORKFLOWS_DB[workflow_name_to_delete] print(f"--- Deleted workflow: {workflow_name_to_delete} ---") self.send_response(200) self.send_header('Content-type', 'application/json') self._send_cors_headers() self.end_headers() self.wfile.write(json.dumps({"status": "deleted", "name": workflow_name_to_delete}).encode()) else: # 如果找不到要删除的工作流 self.send_response(404) self._send_cors_headers() self.end_headers() self.wfile.write(json.dumps({"status": "error", "message": "Workflow not found"}).encode()) else: self.send_response(400) self._send_cors_headers() self.end_headers() self.wfile.write(b'Bad Request: Invalid delete path') def run(server_class=HTTPServer, handler_class=SimpleAPIHandler, port=8000): server_address = ('', port) httpd = server_class(server_address, handler_class) print(f"测试API服务器已在 http://localhost:{port} 上启动...") print(" - POST /api/workflow: 发布新工作流") print(" - GET /api/workflow: 获取所有工作流") print(" - DELETE /api/workflow/: 删除指定工作流") httpd.serve_forever() if __name__ == '__main__': run()