3

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

我尝试将接口定义为

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

但通话超时。

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

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

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

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

有任何想法吗?

4

2 回答 2

3

您可以定义您的接口以返回一个字符串并以这种方式获取原始 JSON:

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

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

于 2017-09-12T09:24:29.163 回答
3

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>您的返回类型(或Task<HttpResponseMessage>,甚至Task<HttpContent>麻烦。

于 2017-09-12T20:39:54.680 回答