RestSharp 反序列化 401 对具有默认值的对象的响应
RestSharp deserializing 401 response to object with default values
我在使用 RestSharp 时遇到了问题。
我的客户端中有一个方法,如下所示。当我发送带有有效令牌的请求时,我得到类型为 StravaActivityDto
的 IEnumerable
,并且它工作正常。
但是当我发送一个请求并且我的令牌无效时,活动变量不是 null 它是类型 StravaActivityDto
的 IEnumerable
,但它始终只有一个对象,并且它有一个默认值每个 属性(例如 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")
};
我在使用 RestSharp 时遇到了问题。
我的客户端中有一个方法,如下所示。当我发送带有有效令牌的请求时,我得到类型为 StravaActivityDto
的 IEnumerable
,并且它工作正常。
但是当我发送一个请求并且我的令牌无效时,活动变量不是 null 它是类型 StravaActivityDto
的 IEnumerable
,但它始终只有一个对象,并且它有一个默认值每个 属性(例如 Id
=0,MaxSpeed
=0)。
我检查了 Postman 中的行为,如果我使用无效令牌发出请求,则响应的状态代码为 401。
如果请求无效(这会导致使用默认值创建 StravaActivityDto
),我如何阻止 RestSharp 反序列化响应。
我知道我可以使用 request.Execute
然后检查 IsSuccessful
状态,但我想在调用 request.Get<>()
.
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")
};