使用 RestSharp 基本身份验证 return 的网络 api null

Consuming web api with RestSharp basic authentication return null

我正在尝试使用具有基本身份验证的 RestSharp 端点。 我按照文档中的说明进行操作 https://restsharp.dev/getting-started/getting-started.html 请求成功,但我认为请求正文格式不正确。

我怎样才能让它工作

  internal BalanceInquiryResponse BalanceInquiryRest(BalanceInquiryRequest BalanceInquiryRequest, Settings Settings)
        {
          // BalanceInquiryResponse BalanceInquiryResponse = new BalanceInquiryResponse();
            
            var client = new RestClient(Settings.BaseUrl + "All/Inquiry");
            client.Authenticator = new HttpBasicAuthenticator(Settings.Username, Settings.Password);
            client.Timeout = -1;
            var request = new RestRequest(Method.POST);
            request.AddHeader("Content-Type", "application/json");
            request.AddJsonBody(new
            {
                Acc = BalanceInquiryRequest.Acc
            });

            IRestResponse response = client.Execute(request);
            IRestResponse<BalanceInquiryResponse> res = client.Execute<BalanceInquiryResponse>(request);
                        
            if (response.IsSuccessful)
            {
                BalanceInquiryResponse = new BalanceInquiryResponse
                {
                    responseInquiry = res.Data.responseInquiry,
                    ResponseDescription = res.Data.ResponseDescription,
                    ResponseMessage = res.Data.ResponseMessage
                };
                return BalanceInquiryResponse;
            }
            else
            {
                BalanceInquiryResponse = new BalanceInquiryResponse
                {               
                    ResponseDescription = responseses.ErrorMessage,             
                };
                return BalanceInquiryResponse;
            }
        }

这是我的回复正文

{
  "responseMessage": "Successful",
  "responseDescription": "Request Successful",
  "responseInquiry": null
}

当我尝试使用邮递员时,我得到了

{
    "ResponseMessage": "Successful",
    "ResponseDescription": "Request Successful",
    "response": {
        "AvalBal": 586324.42,
        "ReverAmt": 0,
        "AccCurrency": "US "
    }
}
IRestResponse<BalanceInquiryResponse> res = client.Execute<BalanceInquiryResponse>(request);

所以有一个特定的原因...您将 BalanceInquiryResponse 放在上面的通用 IRestResponse 中。

通过上面的调用,这应该会自动激活 BalanceInquiryResponse 对象,您不需要手动映射。

Aka,你不应该~需要下面的代码:

            BalanceInquiryResponse = new BalanceInquiryResponse
            {
                responseInquiry = res.Data.responseInquiry,
                ResponseDescription = res.Data.ResponseDescription,
                ResponseMessage = res.Data.ResponseMessage
            };

我认为您的问题是您的 POCO 对象 (BalanceInquiryResponse) 应该完全匹配 JSON 的“结构”。

将您的 BalanceInquiryResponse 更改为完全匹配 json“属性”。

并认识到您有一个嵌套对象。

我想应该是:

public class ResponsePoco    {
    public double AvalBal { get; set; } 
    public int ReverAmt { get; set; } 
    public string AccCurrency { get; set; } 
}

public class BalanceInquiryResponse{
    public string ResponseMessage { get; set; } 
    public string ResponseDescription { get; set; } 
    public ResponsePoco response { get; set; } 
}

注意“ResponsePoco response”..注意变量名是小写的..因为...json里面有一个小写的“response”。 我将(子)对象称为“ResponsePoco”以突出对象名称和变量名称之间的区别。

如果不能“完美”匹配Poco属性。您可以使用属性来“按摩”差异。如此处所示:

https://www.newtonsoft.com/json/help/html/JsonPropertyName.htm

public class Videogame
{
    [JsonProperty("name")]
    public string Name { get; set; }

    [JsonProperty("release_date")]
    public DateTime ReleaseDate { get; set; }
}