You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 09:45:05