109 lines
4.4 KiB
Python
109 lines
4.4 KiB
Python
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/<name>: 删除指定工作流")
|
||
httpd.serve_forever()
|
||
|
||
|
||
if __name__ == '__main__':
|
||
run()
|