【问题标题】:RestSharp on Response dont know how to call callbackRestSharp on Response 不知道如何调用回调
【发布时间】:2016-04-07 21:06:13
【问题描述】:

我正在使用 restsharp 从我正在做的 API 获取数据,我想创建一个名为“ApiInterface”的类,该类将在 Xamarin(Android、iOS、Windows...)中用于调用API。

这个类有它的 RestClient 和函数,可以从代码的任何部分调用,因为它是一个单例。

例如,我将有一个类似这样的 MainActivity.cs。 (调用我的 getData 函数并处理我收到的数据)。

Button buttonListaIntereses = FindViewById<Button> (Resource.Id.myButton);

buttonListaIntereses.Click += delegate {
    ApiInterface.Instance.getData(response2=>
    {
        Intent displayMessage = new Intent(this, typeof(DisplayMessage));
        //Put info in Extra for the new screen.
        displayMessage.PutExtra("content", response2.Content);
        StartActivity(displayMessage);
    });
};

但在 APIInterface 中,我想获取常见的数据,例如 cookie。

public async void getData(Action <IRestResponse> onDone)
{           
    RestRequest request = new RestRequest("getData", Method.GET);

   //Execute ASYNC the rest request
    m_Client.ExecuteAsync (request, response =>
    {
        //Do my stuff with headers.
        string lCookie = response.Headers.ToList().Find(x => x.Name == "Cookie").Value.ToString();
       //Execute the OnDone
       onDone();
    });
}

我的问题是我不确定如何在 getData 中执行 OnDone 和/或如何调用 getData 函数。

谢谢!

【问题讨论】:

    标签: c# xamarin restsharp


    【解决方案1】:

    我将不再使用回调,而是利用 C# 的 Async / Await 功能

    buttonListaIntereses.Click += async delegate {
        var response = await ApiInterface.Instance.getData();
        LaunchResponseActivity(response);
    };
    
    public void LaunchResponseActivity(IRestResponse response)
    {
        Intent displayMessage = new Intent(this, typeof(DisplayMessage));
        //Put info in Extra for the new screen.
        displayMessage.PutExtra("content", response.Content);
        StartActivity(displayMessage);
    }
    
    public async Task<IRestResponse> getData()
    {           
        RestRequest request = new RestRequest("getData", Method.GET);
    
        var cancellationTokenSource = new CancellationTokenSource();
    
        var restResponse = await client.ExecuteTaskAsync(request, cancellationTokenSource.Token);
    
        //Do my stuff with headers.
        string lCookie = restResponse.Headers.ToList().Find(x => x.Name == "Cookie").Value.ToString();
    
        return restResponse;
    }
    

    【讨论】:

    • 嗨 Andrés,我还没有尝试过你的代码,我是使用 async/await c# 功能的新手,它们有什么优势?
    • 您最好更改 xamarin 的所有界面及其导航流程。
    【解决方案2】:

    Action 参数 onDone 采用 IRestReponse 类型的参数:

    public async void getData(Action<IRestResponse> onDone)
    {           
        RestRequest request = new RestRequest("getData", Method.GET);
    
        //Execute ASYNC the rest request
        m_Client.ExecuteAsync (request, response =>
        {
            //Do my stuff with headers.
            string lCookie = response.Headers.ToList().Find(x => x.Name == "Cookie").Value.ToString();
    
            // Execute the onDone action with the received response
            onDone(response);
        });
    }
    

    【讨论】:

    • 感谢 lenkan!我被困住了! :)
    猜你喜欢
    • 2010-11-05
    • 2019-10-27
    • 2020-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-21
    • 1970-01-01
    • 2020-11-25
    相关资源
    最近更新 更多