我应该如何在Windows Phone 7上使用RestSharp实现ExecuteAsync?

jos*_*lie 28 c# api rest windows-phone-7 restsharp

我正在尝试使用RestSharp GitHub wiki上的文档来实现对我的REST API服务的调用,但我特别遇到了ExecuteAsync方法的问题.

目前我的代码对于API类来说是这样的:

public class HarooApi
{
    const string BaseUrl = "https://domain.here";

    readonly string _accountSid;
    readonly string _secretKey;

    public HarooApi(string accountSid, string secretKey)
    {
        _accountSid = accountSid;
        _secretKey = secretKey;
    }

    public T Execute<T>(RestRequest request) where T : new()
    {
        var client = new RestClient();
        client.BaseUrl = BaseUrl;
        client.Authenticator = new HttpBasicAuthenticator(_accountSid, _secretKey);
        request.AddParameter("AccountSid", _accountSid, ParameterType.UrlSegment);
        client.ExecuteAsync<T>(request, (response) =>
        {
            return response.Data;
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

我知道这稍微偏离了GitHub页面上的内容,但我在WP7中使用它,并且相信该示例是针对C#的,因此使用了ExecuteAsync方法.

我的问题是ExecuteAsync命令应该包含什么.我不能用,return response.Data因为我被警告:

'System.Action<RestSharp.RestResponse<T>,RestSharp.RestRequestAsyncHandle>' returns void, a return keyword must not be followed by an object expression
Run Code Online (Sandbox Code Playgroud)

有没有人对如何解决这个或可能有帮助的教程有任何见解?

Gus*_*ten 49

老问题但是如果你使用的是C#5,你可以通过创建一个TaskCompleteSource来恢复T的任务,从而得到一个通用的执行类.你的代码看起来像这样:

public Task<T> ExecuteAsync<T>(RestRequest request) where T : new()
    {
        var client = new RestClient();
        var taskCompletionSource = new TaskCompletionSource<T>();
        client.BaseUrl = BaseUrl;
        client.Authenticator = new HttpBasicAuthenticator(_accountSid, _secretKey);
        request.AddParameter("AccountSid", _accountSid, ParameterType.UrlSegment);
        client.ExecuteAsync<T>(request, (response) => taskCompletionSource.SetResult(response.Data));
        return taskCompletionSource.Task;
    }
Run Code Online (Sandbox Code Playgroud)

并像这样使用它:

private async Task DoWork()
    {
        var api = new HarooApi("MyAcoountId", "MySecret");
        var request = new RestRequest();
        var myClass = await api.ExecuteAsync<MyClass>(request);

        // Do something with myClass
    }
Run Code Online (Sandbox Code Playgroud)


Ped*_*mas 26

您的代码应如下所示:

public class HarooApi
{
    const string BaseUrl = "https://domain.here";

    readonly string _accountSid;
    readonly string _secretKey;

    public HarooApi(string accountSid, string secretKey)
    {
        _accountSid = accountSid;
        _secretKey = secretKey;
    }

    public void ExecuteAndGetContent(RestRequest request, Action<string> callback)
    {
        var client = new RestClient();
        client.BaseUrl = BaseUrl;
        client.Authenticator = new HttpBasicAuthenticator(_accountSid, _secretKey);
        request.AddParameter("AccountSid", _accountSid, ParameterType.UrlSegment);
        client.ExecuteAsync(request, response =>
        {
            callback(response.Content);
        });
    }

    public void ExecuteAndGetMyClass(RestRequest request, Action<MyClass> callback)
    {
        var client = new RestClient();
        client.BaseUrl = BaseUrl;
        client.Authenticator = new HttpBasicAuthenticator(_accountSid, _secretKey);
        request.AddParameter("AccountSid", _accountSid, ParameterType.UrlSegment);
        client.ExecuteAsync<MyClass>(request, (response) =>
        {
            callback(response.Data);
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

我添加了两个方法,因此您可以检查您想要的内容(来自响应主体的字符串内容,或此处表示的反序列化类MyClass)

  • 有人可以帮我如何使用ExecuteAndGetMyClass吗? (9认同)

smo*_*nes 22

作为替代(或补充)的罚款答案通过Gusten.你可以用ExecuteTaskAsync.这种方式你不需要手动处理TaskCompletionSource.请注意async签名中的关键字.

public async Task<T> ExecuteAsync<T>(RestRequest request) where T : new()
{
    var client = new RestClient();
    client.BaseUrl = BaseUrl;
    client.Authenticator = new HttpBasicAuthenticator(_accountSid, _secretKey);
    request.AddParameter("AccountSid", _accountSid, ParameterType.UrlSegment);
    IRestResponse<T> response = await client.ExecuteTaskAsync<T>(request);
    return response.Data;
}
Run Code Online (Sandbox Code Playgroud)


小智 7

或者更确切地说是这样的:

    public async Task<IRestResponse<T>> ExecuteAsync<T>(IRestRequest request) where T : class, new()
    {
        var client = new RestClient(_settingsViewModel.BaseUrl);

        var taskCompletionSource = new TaskCompletionSource<IRestResponse<T>>();
        client.ExecuteAsync<T>(request, restResponse =>
        {
            if (restResponse.ErrorException != null)
            {
                const string message = "Error retrieving response.";
                throw new ApplicationException(message, restResponse.ErrorException);
            }
            taskCompletionSource.SetResult(restResponse);
        });

        return await taskCompletionSource.Task;
    }
Run Code Online (Sandbox Code Playgroud)