【问题标题】:Is it possible to remove quotations from AddParameter method RestSharp?是否可以从 AddParameter 方法 RestSharp 中删除引号?
【发布时间】:2021-10-26 13:37:44
【问题描述】:

我在使用 RestSharp 时遇到了问题。我需要进行 POST 调用,但使用引号它不起作用。

JSON 需要如下所示:

{
  "api_key": "<api key>",
  "controller": "invoice",
  "action": "add",
    "DebtorCode": "DB10000",
    "Term": 14,
    "InvoiceLines": [{"ProductCode":"P0001","Number":15},{"ProductCode":"P0002","Number":15},{"ProductCode":"P0003","Number":15}]
}

但是当我发送我的请求时,它被这样接收:导致它失败。

{
   "api_key": "<api key>",
   "controller": "invoice",
   "action": "add",
   "DebtorCode": "DB10000",
   "Term": "14",
   "InvoiceLines": "[{\"ProductCode\":\"P0001\",\"Number\":15},{\"ProductCode\":\"P0002\",\"Number\":15},{\"ProductCode\":\"P0003\",\"Number\":15}]"
}

我的调用代码如下:

            var newInvoice = new InvoiceToSend();

            newInvoice.DebtorCode = invoiceItem.DebtorCode;
            newInvoice.Term = Convert.ToInt32(invoiceItem.Term);
            newInvoice.InvoiceLines = new List<InvoiceLines>();

            for (int i = 0; i < invoiceItem.InvoiceLines.Count; i++)
            {
                var newLine = new InvoiceLines();

                newLine.Number = Convert.ToInt32(invoiceItem.InvoiceLines[i].Number);
                newLine.ProductCode = invoiceItem.InvoiceLines[i].ProductCode;
                
                newInvoice.InvoiceLines.Add(newLine);
            }

            object invoiceLines = JsonConvert.SerializeObject(newInvoice.InvoiceLines);

            var request = new RestRequest(Method.POST)
            {
                AlwaysMultipartFormData = true
            };
            request.AddParameter("api_key", _options.ApiKey, ParameterType.GetOrPost);
            request.AddParameter("controller", "invoice", ParameterType.GetOrPost);
            request.AddParameter("action", "add", ParameterType.GetOrPost);
            request.AddParameter("DebtorCode", newInvoice.DebtorCode);
            request.AddParameter("Term", newInvoice.Term);
            request.AddParameter("InvoiceLines", invoiceLines);

            var response = Client.Execute(request);

现在我在互联网上看到很多帖子说你需要使用 AddBody 或 AddJsonBody 而不是 AddParameter,但是我的 POST 调用的接收者不接受“application/json”作为名称,所以这不起作用。

RestSharp 是否有可能实现我想要的,还是我必须找到替代方案?如果是这样,你能指出我正确的方向吗?

提前干杯和感谢!

【问题讨论】:

  • object invoiceLines = JsonConvert.SerializeObject(newInvoice.InvoiceLines); 这是你的错误,它是双重序列化。只需传入request.AddParameter("InvoiceLines", newInvoice.InvoiceLines);
  • 不要序列化invoiceLines。发送请求时会自动序列化
  • "我的 POST 调用的接收者不接受 "application/json" 那他们为什么要接受 JSON 内容呢?
  • 嘿@Charlieface,如果我不序列化它,它会这样接收:“InvoiceLines”:“System.Collections.Generic.List`1[Timesheet_Api.Models.InvoiceLines]”} 所以我觉得没关系。
  • 想一想:作为一个查询参数,我不确定它在没有引用的情况下是否有效。它不应该是 JSON 正文而不是查询字符串参数吗?好像还有QueryStringWithoutEncode

标签: c# json asp.net-core restsharp


【解决方案1】:

我想通了。如果有人偶然发现相同的问题,这就是答案:

我不再尝试使用 RestSharp 修复它。相反,我使用了 HttpClient()。我在 InvoiceToSend 模型中添加了 api_key、控制器和操作;

public class InvoiceToSend
{
    public string api_key { get; set; }
    public string controller { get; set; }
    public string action { get; set; }
    public string DebtorCode { get; set; }
    public int Term { get; set; }
    public List<InvoiceLines> InvoiceLines { get; set; }
}

public class InvoiceLines
{
    public string ProductCode { get; set; }
    public int Number { get; set; }
}

然后用我需要的数据填充它;

            var newInvoice = new InvoiceToSend();

            newInvoice.api_key = _options.ApiKey;
            newInvoice.controller = "invoice";
            newInvoice.action = "add";
            newInvoice.DebtorCode = invoiceItem.DebtorCode;
            newInvoice.Term = Convert.ToInt32(invoiceItem.Term);
            newInvoice.InvoiceLines = new List<InvoiceLines>();

            for (int i = 0; i < invoiceItem.InvoiceLines.Count; i++)
            {
                var newLine = new InvoiceLines();

                newLine.Number = Convert.ToInt32(invoiceItem.InvoiceLines[i].Number);
                newLine.ProductCode = invoiceItem.InvoiceLines[i].ProductCode;
                
                newInvoice.InvoiceLines.Add(newLine);
            }

然后使用 HttpClient() 进行 POST 调用:

            var client = new HttpClient();
            var json = JsonConvert.SerializeObject(newInvoice);
            var data = new StringContent(json);

            var response = await client.PostAsync(_options.BaseUrl, data);

希望我以后能在这方面帮助别人;)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-12
    • 2010-10-10
    • 1970-01-01
    • 1970-01-01
    • 2017-08-19
    相关资源
    最近更新 更多