首页 > 解决方案 > 使用 RestSharp 基本身份验证使用 web api 返回 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 "
    }
}

标签: httpasp.net-coreasp.net-web-apibasic-authenticationrestsharp

解决方案


IRestResponse<BalanceInquiryResponse> res = client.Execute<BalanceInquiryResponse>(request);

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

通过上面的调用,这应该会自动对 BalanceInquiryResponse 对象进行水合,并且您不需要手动映射。

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

            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 响应”..注意变量名称是 LOWERCASE .. 因为...json 中有一个小写的“响应”。我已将(子)对象称为“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; }
}

推荐阅读