RestClient返回通用响应

时间:2015-11-02 11:14:31

标签: c# .net rest

我有一些代码:

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; }
}

作为回应,我可以找到对象Data(response.Data),其中包含来自url的值的字段。

例如,我收到数据响应:{ResultCheck = true,Message =&#34; Result!&#34; } 如何在没有指定类型的情况下从任何对象接收来自url的填充数据 - MyClass。我不想收到针对不同网址的任意数量字段的回复。我想收到一些匿名对象。

1 个答案:

答案 0 :(得分:1)

一种方法是使用Genericsdynamic个对象。这应该允许您指定要转换为响应的任何对象类型。

因此,您可以将方法更改为

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;