【问题标题】:RestSharp deserializing 401 response to object with default valuesRestSharp 使用默认值反序列化 401 对对象的响应
【发布时间】:2021-04-24 18:05:06
【问题描述】:

我在使用 RestSharp 时遇到了问题。

我的客户端中有一个方法,如下所示。当我发送一个带有有效令牌的请求时,我得到一个StravaActivityDto 类型的IEnumerable,它工作正常。 但是,当我发送请求并且我的令牌无效时,活动变量不是 null,而是 IEnumerable 类型为 StravaActivityDto,但它始终只有一个对象,并且每个属性都有一个默认值(例如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;
}

【问题讨论】:

    标签: c# json restsharp


    【解决方案1】:

    这是 RestSharp 的默认行为,它不会对带有 HTTP 错误的响应抛出任何错误,仅在传输级别(当服务器无法访问时等)

    所以你有两个选择:

    第一

    在每个请求上添加 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")
    };
    

    【讨论】:

    • 知道了。谢谢:)
    猜你喜欢
    • 1970-01-01
    • 2014-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多