如何使用C#向券商接口发送带Cookie和Payload的下单请求
C# 构造发送券商买入委托请求实现方案
以下两种实现方式可根据你使用的.NET版本选择:
前置准备
首先定义和请求Payload对应的实体类,方便序列化生成JSON:
public class OrderPostRequest { public bool IsSymbolCautionAgreement { get; set; } public bool CautionAgreementSelected { get; set; } public bool IsSymbolSepahAgreement { get; set; } public bool SepahAgreementSelected { get; set; } public int FinancialProviderId { get; set; } public string isin { get; set; } public int maxShow { get; set; } public int minimumQuantity { get; set; } public int orderCount { get; set; } public int orderId { get; set; } public decimal orderPrice { get; set; } public int orderSide { get; set; } public int orderValidity { get; set; } public string orderValiditydate { get; set; } public int shortSellIncentivePercent { get; set; } public bool shortSellIsEnabled { get; set; } }
如果用Newtonsoft.Json序列化可以直接用这个类,如果用System.Text.Json记得按需配置序列化规则,避免驼峰/帕斯卡命名不匹配的问题。
方案1:使用HttpClient(推荐,适用于.NET Core 2.0+、.NET 5+所有新版本)
HttpClient是.NET官方目前推荐的HTTP客户端,性能和易用性都优于HttpWebRequest,代码示例如下:
using System.Net.Http; using System.Net.Http.Headers; using System.Text; using System.Text.Json; // 注意:HttpClient全局初始化一次即可,不要每次请求都new private static readonly HttpClient _httpClient = new HttpClient(); public async Task SendOrderRequestAsync() { // 1. 构造请求数据 var orderReq = new OrderPostRequest { IsSymbolCautionAgreement = false, CautionAgreementSelected = false, IsSymbolSepahAgreement = false, SepahAgreementSelected = false, FinancialProviderId = 1, isin = "IRT1PLSH0001", maxShow = 0, minimumQuantity = 0, orderCount = 1000, orderId = 0, orderPrice = 82870, orderSide = 65, // 买卖方向,65对应买入,可根据券商规则调整 orderValidity = 74, orderValiditydate = null, shortSellIncentivePercent = 0, shortSellIsEnabled = false }; // 2. 序列化为JSON var json = JsonSerializer.Serialize(orderReq); var content = new StringContent(json, Encoding.UTF8, "application/json"); // 3. 配置请求头,和抓包拿到的保持一致 _httpClient.DefaultRequestHeaders.Clear(); _httpClient.DefaultRequestHeaders.Add("authorization", "BasicAuthentication ca4f8b23-2921-4f51-ab7c-ed9fcb04bb4d"); _httpClient.DefaultRequestHeaders.Add("origin", "https://www.mofidonline.com"); _httpClient.DefaultRequestHeaders.Referrer = new Uri("https://www.mofidonline.com/"); _httpClient.DefaultRequestHeaders.UserAgent.ParseAdd("Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.82 Safari/537.36"); _httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("*/*")); _httpClient.DefaultRequestHeaders.AcceptEncoding.ParseAdd("gzip, deflate, br"); _httpClient.DefaultRequestHeaders.AcceptLanguage.ParseAdd("en-US,en;q=0.9,fa;q=0.8"); try { // 4. 发送POST请求 var response = await _httpClient.PostAsync("https://api2.mofidonline.com/Web/V1/Order/Post", content); // 确保请求成功 response.EnsureSuccessStatusCode(); // 读取响应内容 var responseStr = await response.Content.ReadAsStringAsync(); Console.WriteLine($"请求成功,响应内容:{responseStr}"); } catch (HttpRequestException ex) { Console.WriteLine($"请求失败,错误信息:{ex.Message}"); } }
方案2:使用HttpWebRequest(兼容.NET Framework等旧版本框架)
using System.IO; using System.Net; using System.Text; using Newtonsoft.Json; // 也可以用System.Text.Json public void SendOrderRequestWithHttpWebRequest() { // 1. 构造请求对象 var request = (HttpWebRequest)WebRequest.Create("https://api2.mofidonline.com/Web/V1/Order/Post"); request.Method = "POST"; // 2. 配置请求头 request.Headers.Add("authorization", "BasicAuthentication ca4f8b23-2921-4f51-ab7c-ed9fcb04bb4d"); request.Headers.Add("origin", "https://www.mofidonline.com"); request.Referer = "https://www.mofidonline.com/"; request.UserAgent = "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.82 Safari/537.36"; request.Accept = "*/*"; request.Headers.Add("Accept-Encoding", "gzip, deflate, br"); request.Headers.Add("Accept-Language", "en-US,en;q=0.9,fa;q=0.8"); request.ContentType = "application/json"; // 3. 构造请求体 var orderReq = new OrderPostRequest { IsSymbolCautionAgreement = false, CautionAgreementSelected = false, IsSymbolSepahAgreement = false, SepahAgreementSelected = false, FinancialProviderId = 1, isin = "IRT1PLSH0001", maxShow = 0, minimumQuantity = 0, orderCount = 1000, orderId = 0, orderPrice = 82870, orderSide = 65, orderValidity = 74, orderValiditydate = null, shortSellIncentivePercent = 0, shortSellIsEnabled = false }; var json = JsonConvert.SerializeObject(orderReq); var byteData = Encoding.UTF8.GetBytes(json); request.ContentLength = byteData.Length; // 4. 写入请求体 using (var reqStream = request.GetRequestStream()) { reqStream.Write(byteData, 0, byteData.Length); } try { // 5. 获取响应 using (var response = (HttpWebResponse)request.GetResponse()) using (var reader = new StreamReader(response.GetResponseStream())) { var responseStr = reader.ReadToEnd(); Console.WriteLine($"请求成功,响应内容:{responseStr}"); } } catch (WebException ex) { using (var reader = new StreamReader(ex.Response.GetResponseStream())) { var errorStr = reader.ReadToEnd(); Console.WriteLine($"请求失败,错误信息:{ex.Message},错误响应:{errorStr}"); } } }
注意事项
- 抓包拿到的
authorization是身份校验凭证,会定期过期,实际使用时需要先模拟登录券商网站获取最新的有效凭证,不能直接使用示例中的值 - 委托参数如证券代码isin、委托数量orderCount、委托价格orderPrice、买卖方向orderSide等需要根据你的实际交易需求修改
- 券商接口通常有请求频率限制、风控校验规则,异常高频请求可能会导致账号被限制使用,请务必遵守券商的使用规则
- 如果请求失败,优先重新抓包核对请求头、请求体字段是否有更新,是否有新增的校验参数
内容的提问来源于stack exchange,提问作者Ali.s
相关产品推荐
相关产品推荐

