如何使用RestSharp在请求体中提交复杂JSON数据至API?
解决RestSharp提交复杂嵌套JSON请求的问题
看起来你在把非RestSharp的下单逻辑转成RestSharp实现时踩了几个常见的坑,我帮你拆解问题并给出可行的解决方案:
先排查Postman生成代码的致命错误
Postman生成的代码里有两个直接导致请求失败的问题:
- URL包含空格:
https://api.matchbook.com/edge/rest /offers里的rest /offers多了个空格,要改成edge/rest/offers - 请求体添加方式错误:用
AddParameter("undefined", ..., ParameterType.RequestBody)不是RestSharp处理JSON请求体的正确方式,应该用AddBody或AddJsonBody,同时要确保请求格式设置为JSON。
关键注意事项(和你的登录代码对比)
你登录时成功复用了RestClient的CookieContainer来保存会话,下单时必须复用同一个RestClient实例,否则会丢失登录后的session-token Cookie,导致请求未授权。
正确的RestSharp实现方案
下面提供两种可靠的实现方式,你可以根据习惯选择:
方式1:使用强类型对象(推荐,易维护、少出错)
先定义和JSON结构对应的C#类(用JsonProperty映射kebab-case的字段名):
using Newtonsoft.Json; using System.Collections.Generic; public class OfferRequest { [JsonProperty("odds-type")] public string OddsType { get; set; } [JsonProperty("exchange-type")] public string ExchangeType { get; set; } public List<OfferItem> Offers { get; set; } } public class OfferItem { [JsonProperty("runner-id")] public long RunnerId { get; set; } public string Side { get; set; } public double Odds { get; set; } public double Stake { get; set; } }
然后编写RestSharp请求代码(复用登录的WClient):
public void PlaceOfferWithRestSharp(ref RestClient WClient) { // 确保请求URL正确,无空格 var request = new RestRequest("edge/rest/offers", Method.POST); // 设置请求格式为JSON,RestSharp会自动添加Content-Type: application/json request.RequestFormat = DataFormat.Json; // 构建请求体对象 var offerRequest = new OfferRequest { OddsType = "DECIMAL", ExchangeType = "back-lay", Offers = new List<OfferItem> { new OfferItem { RunnerId = 401525949430009, Side = "back", Odds = 2.4, Stake = 5.0 } } }; // 添加请求体,RestSharp会自动序列化对象为JSON request.AddBody(offerRequest); // 执行请求(复用登录后的WClient,自动携带session-token Cookie) var response = WClient.Execute(request); if (response.IsSuccessful) { var parsedJson = Newtonsoft.Json.Linq.JObject.Parse(response.Content); var offerId = parsedJson["offers"][0]["id"].ToString(); Console.WriteLine($"Offer ID: {offerId}"); Console.WriteLine(parsedJson); } else { Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine($"请求失败: {response.StatusCode} - {response.ErrorMessage}"); Console.WriteLine($"响应内容: {response.Content}"); } }
方式2:直接使用JObject(和你原有非RestSharp代码风格一致)
如果你不想定义强类型类,可以直接用JObject来构建请求体:
public void PlaceOfferWithJObject(ref RestClient WClient) { var request = new RestRequest("edge/rest/offers", Method.POST); request.RequestFormat = DataFormat.Json; // 用JObject构建请求体(避免手动拼接JSON的语法错误) var jsonData = Newtonsoft.Json.Linq.JObject.Parse(@" { ""odds-type"":""DECIMAL"", ""exchange-type"":""back-lay"", ""offers"": [ { ""runner-id"":401525949430009, ""side"":""back"", ""odds"":2.4, ""stake"":5.0 } ] }"); // 添加JSON请求体 request.AddJsonBody(jsonData); var response = WClient.Execute(request); // 后续处理和方式1一致... }
额外提示
- 不要手动拼接JSON字符串,很容易出现引号、逗号、数据类型(比如
runner-id是数字,不要加引号)的错误,用强类型或JObject更可靠。 - 如果需要手动添加Cookie(比如复用session-token),可以用
request.AddCookie("session-token", Login.SessionToken),但复用RestClient的CookieContainer是更简单的方式,和你登录时的逻辑保持一致。
内容的提问来源于stack exchange,提问作者Kynao
相关产品推荐
相关产品推荐

