[英]RestSharp deserializing 401 response to object with default values
我在使用 RestSharp 时遇到了问题。
我的客户端中有一个方法,如下所示。 当我使用有效令牌发送请求时,我得到一个StravaActivityDto
类型的IEnumerable
,并且它工作正常。 但是当我发送请求并且我的令牌无效时,活动变量不是 null 而是StravaActivityDto
类型的IEnumerable
,但它始终只有一个 object ,并且在每个属性中都有一个默认值(例如Id
=0, MaxSpeed
=0)。
我检查了 Postman 中的行为,如果我使用无效令牌发出请求,则响应的状态代码为 401。
如果请求无效(这导致使用默认值创建StravaActivityDto
),我如何阻止 RestSharp 反序列化响应。
我知道我可以使用request.Execute
然后检查IsSuccessful
状态,但我想在调用request.Get<>()
后得到 null 。
public async Task<IEnumerable<StravaActivityDto>> GetActivities(string token)
{
var request = new RestRequest("activities", DataFormat.Json);
request.AddHeader("authorization", "Bearer " + token);
var activities = await RestClient.GetAsync<IEnumerable<StravaActivityDto>>(request);
return activities;
}
这是 RestSharp 的默认行为,它不会在 HTTP 错误的响应中引发任何错误,仅在传输级别(当服务器无法访问等时)
所以你有2个选择:
第一的
在每个请求上添加OnBeforeDeserialization
request.OnBeforeDeserialization = response =>
{
if (!response.IsSuccessful)
throw new Exception("Response is unsuccessful");
};
第二
使用ExecuteGetAsync而不是GetAsync方法并检查每个响应的错误。
var response = await client.ExecuteGetAsync<IEnumerable<StravaActivityDto>>(request);
if (!response.IsSuccessful)
throw new Exception("Response is unsuccessful");
return response.Data;
也代替使用
request.AddHeader("authorization", "Bearer " + token);
在每个请求上,您可以在客户端初始化中使用一次 JwtAuthenticator(或您的自定义身份验证器)。
var client = new RestClient()
{
Authenticator = new JwtAuthenticator("MyBearerToken")
};
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.