在好例子网,分享、交流、成长!
您当前所在位置:首页Python 开发实例Python网络编程 → http_Client API测试工具

http_Client API测试工具

Python网络编程

下载此实例
  • 开发语言:Python
  • 实例大小:6.51KB
  • 下载次数:2
  • 浏览次数:16
  • 发布时间:2025-08-05
  • 实例类别:Python网络编程
  • 发 布 人:NewIdeas
  • 文件格式:.py
  • 所需积分:2
 相关标签: Client http API GET POST

实例介绍

【实例简介】非常简单的用于测试web_API的HTTP客户端工具
【实例截图】from clipboard
【核心代码】
import tkinter as tk
from tkinter import ttk, messagebox
import requests
import json

class HttpClientApp:
    def __init__(self, root):
        self.root = root
        self.root.title(" HTTP Client 测试工具")
        self.root.geometry("800x600")
        self.root.resizable(True, True)

        self.setup_ui()

    def setup_ui(self):
        # 主框架
        main_frame = ttk.Frame(self.root, padding=10)
        main_frame.pack(fill=tk.BOTH, expand=True)

        # === 第一行:URL 输入 ===
        ttk.Label(main_frame, text="URL:").grid(row=0, column=0, sticky='w', pady=5)
        self.url_var = tk.StringVar()
        self.url_entry = ttk.Entry(main_frame, textvariable=self.url_var, width=60, font=("Consolas", 10))
        self.url_entry.grid(row=0, column=1, columnspan=2, padx=(5, 5), pady=5, sticky='ew')

        # === 第二行:请求方式 发送按钮 ===
        ttk.Label(main_frame, text="方法:").grid(row=1, column=0, sticky='w', pady=5)
        self.method_var = tk.StringVar(value="GET")
        method_frame = ttk.Frame(main_frame)
        method_frame.grid(row=1, column=1, sticky='w', pady=5)
        ttk.Radiobutton(method_frame, text="GET", variable=self.method_var, value="GET").pack(side=tk.LEFT)
        ttk.Radiobutton(method_frame, text="POST", variable=self.method_var, value="POST").pack(side=tk.LEFT)

        self.send_btn = ttk.Button(main_frame, text=" 发送请求", command=self.send_request)
        self.send_btn.grid(row=1, column=2, padx=5)

        # === 第三行:请求头(可选) ===
        ttk.Label(main_frame, text="请求头 (JSON格式, 可选):").grid(row=2, column=0, columnspan=3, sticky='w', pady=(10, 5))
        self.headers_text = tk.Text(main_frame, height=3, font=("Consolas", 9))
        self.headers_text.grid(row=3, column=0, columnspan=3, padx=0, pady=5, sticky='ew')
        self.headers_text.insert("1.0", '{\n  "Content-Type": "application/json"\n}')

        # === 第四行:POST 请求体(仅POST时显示) ===
        self.body_label = ttk.Label(main_frame, text="POST 请求体 (JSON):")
        self.body_label.grid(row=4, column=0, columnspan=3, sticky='w', pady=(10, 5))
        self.body_text = tk.Text(main_frame, height=5, font=("Consolas", 9))
        self.body_text.grid(row=5, column=0, columnspan=3, padx=0, pady=5, sticky='ew')
        self.body_text.insert("1.0", '{}')

        # === 第五行:响应显示 ===
        ttk.Label(main_frame, text="响应内容:").grid(row=6, column=0, columnspan=3, sticky='w', pady=(10, 5))

        # 响应文本框(带滚动条)
        response_frame = ttk.Frame(main_frame)
        response_frame.grid(row=7, column=0, columnspan=3, sticky='nsew', pady=5)

        self.response_text = tk.Text(response_frame, wrap=tk.WORD, font=("Consolas", 9), height=15)
        scrollbar = ttk.Scrollbar(response_frame, orient=tk.VERTICAL, command=self.response_text.yview)
        self.response_text.configure(yscrollcommand=scrollbar.set)

        self.response_text.pack(side=tk.LEFT, fill=tk.BOTH, expand=True)
        scrollbar.pack(side=tk.RIGHT, fill=tk.Y)

        # 配置网格权重
        main_frame.columnconfigure(1, weight=1)
        main_frame.rowconfigure(7, weight=1)

    def send_request(self):
        url = self.url_var.get().strip()
        method = self.method_var.get()

        if not url:
            messagebox.showerror("错误", "请输入 URL")
            return

        # 解析请求头
        headers = {}
        headers_json = self.headers_text.get("1.0", tk.END).strip()
        if headers_json:
            try:
                headers = json.loads(headers_json)
            except json.JSONDecodeError as e:
                messagebox.showerror("错误", f"请求头 JSON 格式错误:{e}")
                return

        # 准备请求参数
        kwargs = {"headers": headers}

        if method == "POST":
            body_json = self.body_text.get("1.0", tk.END).strip()
            if body_json:
                try:
                    data = json.loads(body_json)
                    # 自动设置 Content-Type 如果未指定
                    if 'content-type' not in (k.lower() for k in headers.keys()):
                        headers['Content-Type'] = 'application/json'
                    kwargs["json"] = data
                except json.JSONDecodeError as e:
                    messagebox.showerror("错误", f"请求体 JSON 格式错误:{e}")
                    return

        try:
            self.response_text.delete("1.0", tk.END)
            self.response_text.insert("1.0", " 正在请求...")

            response = requests.request(method, url, **kwargs)

            # 清空并显示结果
            self.response_text.delete("1.0", tk.END)

            result = f"""=== 响应状态 ===
{response.status_code} {response.reason}
{response.url}

=== 响应头 ===
"""
            for k, v in response.headers.items():
                result = f"{k}: {v}\n"

            result = f"\n=== 响应体 ===\n"
            try:
                # 尝试格式化 JSON
                json_data = response.json()
                result = json.dumps(json_data, indent=2, ensure_ascii=False)
            except:
                # 非 JSON 原样输出
                result = response.text

            self.response_text.insert("1.0", result)

        except requests.exceptions.RequestException as e:
            self.response_text.delete("1.0", tk.END)
            self.response_text.insert("1.0", f" 请求失败:\n{e}")

# ============ 运行程序 ============
if __name__ == '__main__':
    root = tk.Tk()
    app = HttpClientApp(root)
    root.mainloop()

标签: Client http API GET POST

实例下载地址

http_Client API测试工具

不能下载?内容有错? 点击这里报错 + 投诉 + 提问

好例子网口号:伸出你的我的手 — 分享

网友评论

发表评论

(您的评论需要经过审核才能显示)

查看所有0条评论>>

小贴士

感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。

  • 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
  • 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
  • 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
  • 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。

关于好例子网

本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明

;
报警