使用 Refit 调用 API 并反序列化为动态

Ste*_*rne 5 json refit

我正在使用 Refit 调用 REST 服务,并且想要反序列化作为动态类型返回的 JSON。

我尝试将接口定义为

[Get("/foo")]
Task<dynamic> GetFoo();
Run Code Online (Sandbox Code Playgroud)

但呼叫超时。

我知道我可以反序列化为这样的动态

var mockString = "{ title: { name: 'fred', book: 'job'} }";
dynamic d = JsonConvert.DeserializeObject(mockString);
Run Code Online (Sandbox Code Playgroud)

但我不知道要传递什么给 Refit 才能让它做同样的事情。

另一种选择是让 Refit 将原始 JSON 传回,这样我就可以自己反序列化它,但我也找不到办法做到这一点。

有任何想法吗?

Ben*_*thy 3

Refit 在底层使用 JSON.NET,因此任何适用于它的反序列化都适用于 Refit,包括dynamic. 你所描述的界面是完全正确的。

这是一个真实的工作示例:

public interface IHttpBinApi
{
    [Get("/ip")]
    Task<dynamic> GetIp();
}

var value = await RestService.For<IHttpBinApi>("http://httpbin.org").GetIp();
Run Code Online (Sandbox Code Playgroud)

如果您使用 iOS 和 Refit 4+,您可能会看到此错误: https: //github.com/paulcbetts/refit/issues/359

正如 Steven Thewissen 所说,您可以使用Task<string>作为返回类型(或Task<HttpResponseMessage>,甚至Task<HttpContent>)来接收原始响应并反序列化自己,但您不必这样做 - Refit 的全部意义在于它应该为您节省麻烦。

[更新:02/2023]

Refit 现在System.Text.Json默认使用(请参阅下面的评论),但这里的方法应该仍然有效。