RestSharp 反序列化 401 对具有默认值的对象的响应

RestSharp deserializing 401 response to object with default values

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

我的客户端中有一个方法,如下所示。当我发送带有有效令牌的请求时,我得到类型为 StravaActivityDtoIEnumerable,并且它工作正常。 但是当我发送一个请求并且我的令牌无效时,活动变量不是 null 它是类型 StravaActivityDtoIEnumerable,但它始终只有一个对象,并且它有一个默认值每个 属性(例如 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 错误的响应上抛出任何错误,仅在传输级别(当服务器无法访问等时)

所以你有两个选择:

第一

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