如何通过HttpClient实现C# WinForms与Python Flask的JSON交互
实现方案整体说明
下面分C# WinForms侧、Flask侧两部分给出可直接落地的实现逻辑,两边字段约定一致即可正常联调。
1 C# WinForms侧实现
1.1 前置准备
- 首先安装对应NuGet包:如果是.NET Core/.NET 5+版本的WinForms,安装
System.Net.Http.Json简化序列化操作;如果是.NET Framework版本,安装Newtonsoft.Json做JSON处理。
1.2 定义参数和返回值实体类
和Flask侧约定好字段名,保证两边字段完全匹配:
// 发送给Flask的请求参数类,可根据业务自行扩展字段 public class ApiRequest { // 示例字段,替换为实际业务参数即可 public int Param1 { get; set; } public string Param2 { get; set; } } // 接收Flask返回的结果类 public class ApiResponse { public int Code { get; set; } // 自定义状态码,比如0代表成功、1代表失败 public string Data { get; set; } // 运算结果 public string ErrorMsg { get; set; } // 错误提示 }
注意字段名大小写尽量和Flask侧保持一致,避免序列化失败
1.3 全局初始化HttpClient
不要每次请求都新建HttpClient,避免端口资源浪费,在Form类中声明为全局静态实例:
public partial class MainForm : Form { // 替换为你实际Flask服务的地址 private static readonly HttpClient _httpClient = new HttpClient() { BaseAddress = new Uri("http://127.0.0.1:5000/"), Timeout = TimeSpan.FromSeconds(15) }; public MainForm() { InitializeComponent(); } }
1.4 发送请求+接收结果的业务逻辑
在按钮点击等触发事件中写异步请求逻辑,避免阻塞界面:
private async void btnSubmit_Click(object sender, EventArgs e) { try { // 1. 从界面控件读取用户输入的参数 var requestParam = new ApiRequest { Param1 = int.Parse(txtParam1.Text), Param2 = txtParam2.Text // 其他参数同理从对应控件取值 }; // 2. 发送POST请求,自动序列化参数为JSON(.NET Core/.NET 5+版本写法) var response = await _httpClient.PostAsJsonAsync("api/process", requestParam); // (.NET Framework版本写法,用Newtonsoft.Json序列化) // string json = JsonConvert.SerializeObject(requestParam); // var content = new StringContent(json, Encoding.UTF8, "application/json"); // var response = await _httpClient.PostAsync("api/process", content); // 3. 校验请求是否成功 response.EnsureSuccessStatusCode(); // 4. 反序列化返回结果(.NET Core/.NET 5+版本写法) var result = await response.Content.ReadFromJsonAsync<ApiResponse>(); // (.NET Framework版本写法) // string responseJson = await response.Content.ReadAsStringAsync(); // var result = JsonConvert.DeserializeObject<ApiResponse>(responseJson); // 5. 将结果展示到界面 if (result.Code == 0) { lblResult.Text = $"运算结果:{result.Data}"; } else { lblResult.Text = $"处理失败:{result.ErrorMsg}"; } } catch (Exception ex) { MessageBox.Show($"请求出错:{ex.Message}", "错误提示", MessageBoxButtons.OK, MessageBoxIcon.Error); } }
注意按钮点击事件要加async关键字,否则异步逻辑无法正常执行,也会导致界面卡死
2 Flask侧配套联调参考
给出最简Flask接口实现,方便你快速测试联调:
from flask import Flask, request, jsonify from flask_cors import CORS # 解决跨域问题,需要先pip install flask-cors app = Flask(__name__) CORS(app) # 允许跨域请求 @app.route('/api/process', methods=['POST']) def process_data(): try: # 接收C#传过来的JSON参数 req_data = request.get_json() param1 = req_data.get('Param1') param2 = req_data.get('Param2') # 这里替换为你实际的业务运算逻辑 result = f"处理完成:{param1} + {param2} 的组合结果" return jsonify({ 'Code': 0, 'Data': result, 'ErrorMsg': '' }) except Exception as e: return jsonify({ 'Code': 1, 'Data': '', 'ErrorMsg': str(e) }), 400 if __name__ == '__main__': app.run(host='0.0.0.0', port=5000, debug=True)
注意事项
- 部署时要确保C#运行的设备可以正常访问Flask服务的IP和端口,防火墙需放通对应端口。
- 如果传输的是大体积参数或运算耗时较长,可在界面上加loading提示,提升用户体验。
内容的提问来源于stack exchange,提问作者LinearityMew
相关产品推荐
相关产品推荐

