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

Call API using Refit and deserialize to dynamic

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

我尝试将接口定义为

[Get("/foo")]
Task<dynamic> GetFoo();

但是调用超时。

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

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

但我不知道要将什么传递给 Refit 以使其执行相同的操作。

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

有什么想法吗?

您可以将接口定义为 return 字符串并以这种方式获取原始 JSON:

[Get("/foo")]
Task<string> GetFoo();

如此处所述: https://github.com/paulcbetts/refit#retrieving-the-response

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

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

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

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

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

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