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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:51:04