import sys
from tkinter import Tk, Label, Entry, Button, Text, messagebox
import tkinter as tk
from http.server import BaseHTTPRequestHandler, HTTPServer
from urllib.parse import urlparse, parse_qs
import json
import threading
# 创建一个自定义的请求处理类
class RequestHandler(BaseHTTPRequestHandler) :
# 处理POST请求
def do_POST(self) :
content_length = int(self.headers['Content-Length'])
post_data = self.rfile.read(content_length)
print('接收到的POST请求URL:', self.path)
print('接收到的POST请求内容:', post_data.decode('utf-8'))
# print('打印出post_data',post_data)
parsed_data = parse_qs(post_data.decode('utf-8'))
# 获取请求参数,这里假设参数名为'content'
content = parsed_data.get('content', [''])[0]
# 构造要返回的JSON数据
# json_str1= json_entry.get()
# response_data=json.loads(json_str1)
json_str1=json_entry.get("1.0", tk.END)
# print(json_str1)
print('要返回的JSON数据:', json_str1)
response_data=eval(json_str1)
response_json = json.dumps(response_data)
self.send_response(200)
self.send_header('Content-type', 'application/json')
self.end_headers()
self.wfile.write(response_json.encode('utf-8'))
# 启动HTTP服务的函数
def start_server(ip, port) :
server_address = (ip, port)
print(server_address)
httpd = HTTPServer(server_address, RequestHandler)
print(httpd)
httpd.serve_forever()
# 点击按钮时执行的函数
def start_button_click() :
ip = ip_entry.get()
port = int(port_entry.get())
try :
# 启动HTTP服务的线程
threading.Thread(target=start_server, args=(ip, port), daemon=True).start()
messagebox.showinfo('提示', 'HTTP服务已启动')
except Exception as e :
messagebox.showerror('错误', f'启动HTTP服务出错:{str(e)}')
# 创建Tkinter窗口
root = Tk()
root.title('HTTP服务工具')
# 创建IP标签和输入框
ip_label = Label(root, text='IP地址:')
ip_label.pack()
ip_entry = Entry(root)
ip_entry.insert(0, '172.26.74.39') # 默认IP地址为127.0.0.1
ip_entry.pack()
# 创建端口标签和输入框
port_label = Label(root, text='端口:')
port_label.pack()
port_entry = Entry(root)
port_entry.insert(0, '8383') # 默认端口号为8383
port_entry.pack()
# 创建JSON数据标签和输入框
json_label = Label(root, text='JSON数据:')
json_label.pack()
json_obj={
"code": 200,
"message": "获取处方成功!",
"data": {
"prescriptionId": "IP20230803100122",
"innerId": 0,
"sysRecipeCode": None,
"hospitalName": "test",
"quantity": 7,
"boilType": 0,
"boilTypeName": "煎药",
"recipientName": "题",
"sex": "女",
"age": 1,
"receiveTime": "2023-08-03T15:10:52",
"remark": None,
"details": [
{
"medicineCode": "1030",
"medicineName": "艾叶",
"hisMedicineName": None,
"dose": 5.0000,
"doseUnit": "g",
"specialBoilType": "煎煮"
}
]
}}
json_entry = Text(root, height=10, width=50)
json_entry.insert("1.0", str(json_obj))
json_entry.pack()
# 创建启动按钮
start_button = Button(root, text='启动服务', command=start_button_click)
start_button.pack()
root.geometry("400x300") # 设置窗口大小为400x300像素
# 运行Tkinter事件循环
root.mainloop()
注意事项:json值中,null需要修改成None;这里用到了eval,去掉了字符串前后的符号,传递值给了变量。
该文章详细描述了一个使用PythonTkinter创建的HTTP服务器,处理POST请求并将用户输入的JSON数据转换为响应。还涉及了线程启动、异常管理和处方数据的JSON结构。
1623





