使用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 "
    }
}

解决方法

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 response”。注意变量名称为LOWERCASE ..因为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; }
}

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...