繁体   English   中英

RestSharp 使用默认值反序列化对 object 的 401 响应

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM