使用 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 的全部意义在于它应该为你省去麻烦。
我正在使用 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 的全部意义在于它应该为你省去麻烦。