本帖最后由 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)
|