RESTClient实现返回通用响应
问题描述:
我有一些代码:RESTClient实现返回通用响应
public Task<IRestResponse> SendRequest(string url, string bodyJson)
{
var client = new RestClient(url);
var request = new RestRequest();
request.RequestFormat = DataFormat.Json;
request.Method = Method.POST;
request.AddBody(bodyJson);
var taskCompletionSource = new TaskCompletionSource<IRestResponse>();
client.ExecuteAsync(request, response =>
{
taskCompletionSource.SetResult(response);
});
return taskCompletionSource.Task;
}
响应包含了所有而不是从URL答案(响应犯规”包含数据对象)。当我为ExecuteAsync指定对象时:
public Task<IRestResponse<MyClass>> SendRequest(string url, string bodyJson)
{
var client = new RestClient(url);
var request = new RestRequest();
request.RequestFormat = DataFormat.Json;
request.Method = Method.POST;
request.AddBody(bodyJson);
var taskCompletionSource = new TaskCompletionSource<IRestResponse<MyClass>>();
client.ExecuteAsync<MyClass>(request, response =>
{
taskCompletionSource.SetResult(response);
});
return taskCompletionSource.Task;
}
public class MyClass
{
public bool ResultCheck { get; set; }
public string Message { get; set; }
}
作为响应我可以找到包含具有来自url的值的字段的对象Data(response.Data)。
例如,我收到Data的响应:{ResultCheck = true,Message =“Result!” } 如何从任何没有指定类型的对象 - MyClass接收URL的填充数据。我不想接收任何不同网址的回复。我想收到一些匿名对象。
答
一种方法是使用Generics和dynamic对象。这应该允许您指定任何要转换为响应的对象类型。
您可以因此,该方法改变为
public Task<IRestResponse<T>> SendRequest<T>(string url, string bodyJson)
{
var client = new RestClient(url);
var request = new RestRequest
{
RequestFormat = DataFormat.Json;
Method = Method.POST;
};
request.AddBody(bodyJson);
var taskCompletionSource = new TaskCompletionSource<IRestResponse<T>>();
client.ExecuteAsync<T>(request, response =>
{
taskCompletionSource.SetResult(response);
});
return taskCompletionSource.Task;
}
然后,我们可以使用动态创建临时对象。然后我们可以填写所有我们需要的信息
// Create temp obj
dynamic employee = new ExpandoObject();
employee.Name = "John Smith";
employee.Age = 33;
终于在呼叫地点我们声明类型是动态的。希望剩下的api可以将其转发到客户端,并且可以将该对象作为动态类型进行检索。然后
SendRequest<dynamic>(url, JsonConvert.SerialiseObject(employee));
客户可以这样做
dynamic response = GetResponse(...);
var name = response.Name;
我可以做,没有泛型?我不想为不同的网址创建类型。我将使用返回类型的SendRequest()发送到其他地方。并且该应用程序不知道它将接收什么类型的对象。我是否可以为任何对象通用而无需为它们声明类? – Anton23
@ Anton23请参阅编辑。 –
这不是我所需要的。 taskCompletionSource.Task应该返回包含Data对象的对象,其中包含来自url的所有字段。两个应用程序中都没有泛型类和类声明。 – Anton23