首页 > 解决方案 > 为发布请求创建方法时出错

问题描述

当我发布请求时,它会提供给内部服务器。Flurl 的实现是好的还是我做错了什么。

try
{
    Models.PaymentPost paymentPost = new Models.PaymentPost();
    paymentPost.Parts = new Models.Parts();
    paymentPost.Parts.Specification = new Models.Specification();
    paymentPost.Parts.Specification.CharacteristicsValue = new List<Models.CharacteristicsValue>();
    paymentPost.Parts.Specification.CharacteristicsValue.Add(new Models.CharacteristicsValue { CharacteristicName = "Amount", Value = amount });
    paymentPost.Parts.Specification.CharacteristicsValue.Add(new Models.CharacteristicsValue { CharacteristicName = "AccountReference", Value = accountId });

    foreach (var item in extraParameters)
    {
        paymentPost.Parts.Specification.CharacteristicsValue.Add(new Models.CharacteristicsValue { 
        CharacteristicName = item.Key, Value = item.Value });
    }
    var paymentInJson = JsonConvert.SerializeObject(paymentPost);
    var selfCareUrl = "http://svdt5kubmas01.safari/auth/processPaymentAPI/v1/processPayment";
    var fUrl = new Flurl.Url(selfCareUrl);
    fUrl.WithBasicAuth("***", "********");
    fUrl.WithHeader("X-Source-System", "POS");
    fUrl.WithHeader("X-Route-ID", "STKPush");
    fUrl.WithHeader("Content-Type", "application/json");
    fUrl.WithHeader("X-Correlation-ConversationID", "87646eaa-2605-405e-967c-56e8002b5");
    fUrl.WithHeader("X-Route-Timestamp", "150935");
    fUrl.WithHeader("X-Source-Operator", " ");
    var response = await clientFactory.Get(fUrl).Request().PostJsonAsync(paymentInJson).ReceiveJson<IEnumerable<IF.Models.PaymentPost>>();
    return response;
}
catch (FlurlHttpException ex)
{
    dynamic d = ex.GetResponseJsonAsync();
    //string s = ex.GetResponseStringAsync();
    return d;
} 

标签: flurl

解决方案


你不需要这样做:

var paymentInJson = JsonConvert.SerializeObject(paymentPost);

PostJsonAsync只需获取一个常规对象并将其序列化为 JSON。在这里,您有效地对其进行了双重序列化,并且服务器可能对这种格式感到困惑。

您还在做 Flurl 可以为您做的许多其他事情,例如显式创建这些 Url 和客户端对象。虽然这不会导致错误,但这就是 Flurl 通常的使用方式:

var response = await selfCareUrl
    .WithBasicAuth(...)
    .WithHeader(...)
    ...
    .PostJsonAsync(paymentPost)
    .ReceiveJson<List<IF.Models.PaymentPost>>();

推荐阅读