吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 937|回复: 8
收起左侧

[其他原创] .net8写的http接口测试工具

  [复制链接]
jacky520510 发表于 2026-7-1 14:13
本帖最后由 jacky520510 于 2026-7-1 16:07 编辑

有时就想简单测试一个http接口,postman等都非得登录账号,太麻烦了,干脆自己写一个测试用。使用.net8的C#写的winform程序。截图如下:

主界面

主界面

主源码如下:
[C#] 纯文本查看 复制代码
using System.Net.Http.Json;
using System.Security.Policy;
using System.Text;
using System.Text.Json;
using System.Text.RegularExpressions;
using System.Web;
using System.Windows.Forms;
using static System.Runtime.InteropServices.JavaScript.JSType;
using static System.Windows.Forms.Design.AxImporter;

namespace CS_HttpClient
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            /**************************************get tab******************************************************/
            //初始化dgVPostHead
            dgvGetHead.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
            // 添加列
            dgvGetHead.Columns.Add("columParamName", "参数名");
            dgvGetHead.Columns.Add("columParamValue", "参数值");
            // 设置列宽比例 3:7
            dgvGetHead.Columns[0].FillWeight = 30; // 30/(30+70) = 30%
            dgvGetHead.Columns[1].FillWeight = 70; // 70/(30+70) = 70%

            //初始化dgVPostBody
            dgvGetBody.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
            // 添加列
            dgvGetBody.Columns.Add("columParamName", "参数名");
            dgvGetBody.Columns.Add("columParamValue", "参数值");
            // 设置列宽比例 3:7
            dgvGetBody.Columns[0].FillWeight = 30; // 30/(30+70) = 30%
            dgvGetBody.Columns[1].FillWeight = 70; // 70/(30+70) = 70%

            radioGetFormData.Checked = true;

            /**************************************post tab******************************************************/
            //初始化dgVPostHead
            dgvPostHead.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
            // 添加列
            dgvPostHead.Columns.Add("columParamName", "参数名");
            dgvPostHead.Columns.Add("columParamValue", "参数值");
            // 设置列宽比例 3:7
            dgvPostHead.Columns[0].FillWeight = 30; // 30/(30+70) = 30%
            dgvPostHead.Columns[1].FillWeight = 70; // 70/(30+70) = 70%

            //初始化dgVPostBody
            dgvPostBody.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
            // 添加列
            dgvPostBody.Columns.Add("columParamName", "参数名");
            dgvPostBody.Columns.Add("columParamValue", "参数值");
            // 设置列宽比例 3:7
            dgvPostBody.Columns[0].FillWeight = 30; // 30/(30+70) = 30%
            dgvPostBody.Columns[1].FillWeight = 70; // 70/(30+70) = 70%

            radioPostJson.Checked = true;
            txtCMD.Visible = false;
        }

        private void radioGetFormData_CheckedChanged(object sender, EventArgs e)
        {
            if (radioGetFormData.Checked)
            {
                //dgvGetBody.Location = new Point(46, 237);
                dgvGetBody.Visible = true;
            }
        }

        private void radioPostFormData_CheckedChanged(object sender, EventArgs e)
        {
            if (radioPostFormData.Checked)
            {
                //dgvPostBody.Location = new Point(46, 237);
                txtPostBody.Visible = false;
                dgvPostBody.Visible = true;
            }
        }

        private void radioPostJson_CheckedChanged(object sender, EventArgs e)
        {
            if (radioPostJson.Checked)
            {
                //txtPostBody.Location = new Point(46, 237);
                dgvPostBody.Visible = false;
                txtPostBody.Visible = true;
            }
        }

        private void radioPostUrlencoded_CheckedChanged(object sender, EventArgs e)
        {
            if (radioPostUrlencoded.Checked)
            {
                //dgvPostBody.Location = new Point(46, 237);
                txtPostBody.Visible = false;
                dgvPostBody.Visible = true;
            }
        }

        private void radioPostNone_CheckedChanged(object sender, EventArgs e)
        {
            txtPostBody.Visible = false;
            dgvPostBody.Visible = false;
        }

        private async void btnGetSend_Click(object sender, EventArgs e)
        {
            if (txtGetUrl.Text == string.Empty)
            {
                MessageBox.Show("请输入url!");
                return;
            }
            bool isValid = Uri.TryCreate(txtGetUrl.Text, UriKind.Absolute, out Uri uriResult)
                       && (uriResult.Scheme == Uri.UriSchemeHttp || uriResult.Scheme == Uri.UriSchemeHttps);
            if (!isValid)
            {
                MessageBox.Show("请输入有效的url!");
                return;
            }

            txtGetResult.Text = "";
            using HttpClient client = new HttpClient();
            try
            {
                //获取head参数
                for (int i = 0; i < dgvGetHead.Rows.Count; i++)
                {
                    // 跳过新行
                    if (dgvGetHead.Rows[i].IsNewRow) continue;

                    object headParamNameObject = dgvGetHead.Rows[i].Cells[0].Value;
                    string headParamName = headParamNameObject?.ToString() ?? "";
                    object headParamValueObject = dgvGetHead.Rows[i].Cells[1].Value;
                    string headParamValue = headParamValueObject?.ToString() ?? "";
                    if (headParamName != "" && headParamValue != "")
                    {
                        client.DefaultRequestHeaders.Add(headParamName, headParamValue);
                    }
                }
                //获取body参数
                if (radioGetFormData.Checked)
                {
                    UriBuilder builder = new UriBuilder(txtGetUrl.Text);
                    var query = HttpUtility.ParseQueryString(builder.Query);
                    for (int i = 0; i < dgvGetBody.Rows.Count; i++)
                    {
                        // 跳过新行
                        if (dgvGetBody.Rows[i].IsNewRow) continue;

                        object headParamNameObject = dgvGetBody.Rows[i].Cells[0].Value;
                        string headParamName = headParamNameObject?.ToString() ?? "";
                        object headParamValueObject = dgvGetBody.Rows[i].Cells[1].Value;
                        string headParamValue = headParamValueObject?.ToString() ?? "";
                        if (headParamName != "" && headParamValue != "")
                        {
                            query.Add(headParamName, headParamValue);
                        }

                    }
                    builder.Query = query.ToString();
                    //txtGetResult.Text = builder.ToString();
                    // 发送 GET 请求
                    HttpResponseMessage response = await client.GetAsync(builder.Uri);

                    // 确保请求成功(状态码 200-299)
                    response.EnsureSuccessStatusCode();

                    // 读取响应内容(字符串)
                    string responseBody = await response.Content.ReadAsStringAsync();
                    txtGetResult.Text += responseBody;
                }
            }
            catch (HttpRequestException ex)
            {
                txtGetResult.Text = "请求错误:" + ex.Message;
            }


        }

        private async void btnPostSend_Click(object sender, EventArgs e)
        {
            if (txtPostUrl.Text == string.Empty)
            {
                MessageBox.Show("请输入url!");
                return;
            }
            bool isValid = Uri.TryCreate(txtPostUrl.Text, UriKind.Absolute, out Uri uriResult)
                       && (uriResult.Scheme == Uri.UriSchemeHttp || uriResult.Scheme == Uri.UriSchemeHttps);
            if (!isValid)
            {
                MessageBox.Show("请输入有效的url!");
                return;
            }

            txtPostResult.Text = "";
            using HttpClient client = new HttpClient();
            try
            {
                //获取head参数
                for (int i = 0; i < dgvPostHead.Rows.Count; i++)
                {
                    // 跳过新行
                    if (dgvPostHead.Rows[i].IsNewRow) continue;

                    object headParamNameObject = dgvPostHead.Rows[i].Cells[0].Value;
                    string headParamName = headParamNameObject?.ToString() ?? "";
                    object headParamValueObject = dgvPostHead.Rows[i].Cells[1].Value;
                    string headParamValue = headParamValueObject?.ToString() ?? "";
                    if (headParamName != "" && headParamValue != "")
                    {
                        client.DefaultRequestHeaders.Add(headParamName, headParamValue);
                    }
                }
                //获取body参数
                if (radioPostJson.Checked)
                {
                    //创建 HttpContent(设置 Content-Type: application/json)
                    string jsonContent = txtPostBody.Text;
                    if (!IsValidJson(jsonContent))
                    {
                        MessageBox.Show("JSON 格式错误,无法发送请求!");
                        return;
                    }
                    using var content = new StringContent(jsonContent, Encoding.UTF8, "application/json");
                    // 发送 Post 请求
                    HttpResponseMessage response = await client.PostAsync(txtPostUrl.Text, content);
                    // 确保请求成功(状态码 200-299)
                    response.EnsureSuccessStatusCode();

                    // 读取响应内容(字符串)
                    string responseBody = await response.Content.ReadAsStringAsync();
                    Dictionary<string, object> resData = JsonSerializer.Deserialize<Dictionary<string, object>>(responseBody);
                    // 序列化回 JSON 字符串
                    //System.Text.Json 默认会对非 ASCII 字符进行 Unicode 转义,如需禁用
                    var options = new JsonSerializerOptions
                    {
                        Encoder = System.Text.Encodings.Web.JavaScriptEncoder.UnsafeRelaxedJsonEscaping
                    };
                    string jsonString = JsonSerializer.Serialize(resData, options);
                    txtPostResult.Text += jsonString;
                }
                else if (radioPostFormData.Checked)
                {
                    //创建 MultipartFormDataContent
                    using var formData = new MultipartFormDataContent();
                    for (int i = 0; i < dgvPostBody.Rows.Count; i++)
                    {
                        // 跳过新行
                        if (dgvPostBody.Rows[i].IsNewRow) continue;

                        object bodyParamNameObject = dgvPostBody.Rows[i].Cells[0].Value;
                        string bodyParamName = bodyParamNameObject?.ToString() ?? "";
                        object bodyParamValueObject = dgvPostBody.Rows[i].Cells[1].Value;
                        string bodyParamValue = bodyParamValueObject?.ToString() ?? "";
                        if (bodyParamName != "" && bodyParamValue != "")
                        {
                            formData.Add(new StringContent(bodyParamValue), bodyParamName);
                        }
                    }
                    // 发送 Post 请求
                    HttpResponseMessage response = await client.PostAsync(txtPostUrl.Text, formData);
                    // 确保请求成功(状态码 200-299)
                    response.EnsureSuccessStatusCode();

                    // 读取响应内容(字符串)
                    string responseBody = await response.Content.ReadAsStringAsync();
                    txtPostResult.Text += responseBody;
                }
                else if (radioPostUrlencoded.Checked)
                {
                    //创建 FormUrlEncodedContent
                    var urlData = new List<KeyValuePair<string, string>>();
                    for (int i = 0; i < dgvPostBody.Rows.Count; i++)
                    {
                        // 跳过新行
                        if (dgvPostBody.Rows[i].IsNewRow) continue;

                        object bodyParamNameObject = dgvPostBody.Rows[i].Cells[0].Value;
                        string bodyParamName = bodyParamNameObject?.ToString() ?? "";
                        object bodyParamValueObject = dgvPostBody.Rows[i].Cells[1].Value;
                        string bodyParamValue = bodyParamValueObject?.ToString() ?? "";
                        if (bodyParamName != "" && bodyParamValue != "")
                        {
                            urlData.Add(new(bodyParamName, bodyParamValue));
                        }
                    }
                    using var content = new FormUrlEncodedContent(urlData);
                    // 发送 Post 请求
                    HttpResponseMessage response = await client.PostAsync(txtPostUrl.Text, content);
                    // 确保请求成功(状态码 200-299)
                    response.EnsureSuccessStatusCode();

                    // 读取响应内容(字符串)
                    string responseBody = await response.Content.ReadAsStringAsync();
                    txtPostResult.Text += responseBody;
                }
                else if (radioPostNone.Checked)
                {
                    // 发送 Post 请求
                    HttpResponseMessage response = await client.PostAsync(txtPostUrl.Text,null);
                    // 确保请求成功(状态码 200-299)
                    response.EnsureSuccessStatusCode();

                    // 读取响应内容(字符串)
                    string responseBody = await response.Content.ReadAsStringAsync();
                    txtPostResult.Text += responseBody;
                }

            }
            catch (HttpRequestException ex)
            {
                txtPostResult.Text = "请求错误:" + ex.Message;
            }
        }

        public static bool IsValidJson(string json)
        {
            if (string.IsNullOrWhiteSpace(json))
                return false;

            try
            {
                // 尝试解析 JSON(可以是对象或数组)
                using var doc = JsonDocument.Parse(json);
                return true;
            }
            catch (JsonException)
            {
                return false;
            }
        }

        
    }
}


成品下载链接:
CS_HttpClient.7z (61.49 KB, 下载次数: 26)

免费评分

参与人数 2吾爱币 +8 热心值 +1 收起 理由
苏紫方璇 + 7 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
weidechan + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

jun269 发表于 2026-7-1 14:19
路过,,源码看了也白看,不会打包
hjl008 发表于 2026-7-1 15:38
 楼主| jacky520510 发表于 2026-7-1 16:07
 楼主| jacky520510 发表于 2026-7-1 16:08

成品下载链接已加发(需本机装有.net8运行环境才行),在代码下面一行,
wanybme 发表于 2026-7-1 22:20
感谢分享!!
hszgb 发表于 2026-7-2 08:14
正好用上,谢谢了
YoungBai 发表于 2026-7-2 09:31
感谢分享实用小工具.
wfghim 发表于 2026-7-2 14:16
看来 我本地的postman 8.12.2 不用登录的,还是可以用的
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - 52pojie.cn ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2026-7-16 19:49

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表