http - 使用 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 响应”..注意变量名称是 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; }
}
推荐阅读
- symlink - WSL:使用 Windows 中的 WSL 符号链接文件夹
- python-3.x - 如何让我的程序知道并响应按下的键
- r - RMarkdown - knitr - png 大小不会改变
- swift - 重载 == 运算符为 != 调用父函数
- php - 如何在 PHPMailer 成功消息中包含 html div 或 php?
- c# - 奇怪的反序列化异常
- laravel - FontAwesome 图标没有正确堆叠
- python - 抓取必应翻译的问题
- javascript - 如何使用字符串作为 v-model 指令中的属性名称来访问 Vue 组件的数据属性?
- javascript - 为什么我的 JMeter While Controller 无限循环?