Refit - 反序列化对超类型的响应

问题描述 投票:0回答:1

这个问题不一定与 Refit 本身有关,但我们开始吧。 Refit 的内置 ApiResponse 并不能完全满足我的需要。似乎无法访问原始响应以将其反序列化为 ProblemDetails,我的 API 在出现故障时会返回该问题详细信息。我可以将我的方法签名更改为如下所示:

[Multipart]
[Post("/api/importSomething")]
Task<HttpResponseMessage>ImportSomething(string someID, ByteArrayPart File);

这确实使您可以访问原始响应。然而,这种类型不是通用的,它使得转换为我的 Result 对象实现对于调用者客户端来说非常难看。我想要的是子类 HttpResponseMessage 并使其通用,以便 Refit 接口方法看起来像这样:

[Multipart]
[Post("/api/importSomething")]
Task<CustomAPIResponse<SomeResponseDTO>>ImportSomething(string someID, ByteArrayPart File);

这样的事情将是完美的,因为调用者不需要为扩展方法提供泛型类型来转换为我的 Result 对象。显然,按原样使用此代码,refit 会引发异常,因为它试图反序列化为此 CustomAPIResponse 类型,而传入的是 HttpReponseMessage。我如何告诉 Refit 我希望它将我的自定义响应反序列化为超类?

c# json serialization superclass refit
1个回答
0
投票

这可以通过返回

Task<IApiResponse>
Task<IApiResponse<T>>
Task<ApiResponse<T>>

来实现

在改装文档中有一章关于处理异常,它完全涵盖了您的用例。

它的主要优点是,处理响应时的任何 ApiException 以及尝试将响应反序列化为 ApiResponse 时发生的任何错误,都会填充到 ApiResponse 的 Error 属性中,而不会引发异常。

var response = await _myRefitClient.GetSomeStuff();
if(response.IsSuccessStatusCode)
{
   //do your thing
}
else
{
   _logger.LogError(response.Error, response.Error.Content);
}
© www.soinside.com 2019 - 2024. All rights reserved.