diff --git a/RestSharp.IntegrationTests/AsyncTests.cs b/RestSharp.IntegrationTests/AsyncTests.cs index 1951b96c3..29ef61415 100644 --- a/RestSharp.IntegrationTests/AsyncTests.cs +++ b/RestSharp.IntegrationTests/AsyncTests.cs @@ -69,7 +69,7 @@ public void Can_Perform_GET_TaskAsync() } [Fact] - public void Can_Perform_GET_TaskAsync_With_Response_Type() + public void Can_Perform_ExecuteGetTaskAsync_With_Response_Type() { const string baseUrl = "http://localhost:8080/"; using (SimpleServer.Create(baseUrl, Handlers.Generic())) @@ -80,6 +80,22 @@ public void Can_Perform_GET_TaskAsync_With_Response_Type() var task = client.ExecuteTaskAsync(request); task.Wait(); + Assert.Equal("Works!", task.Result.Data.Message); + } + } + + [Fact] + public void Can_Perform_GetTaskAsync_With_Response_Type() + { + const string baseUrl = "http://localhost:8080/"; + using (SimpleServer.Create(baseUrl, Handlers.Generic())) + { + var client = new RestClient(baseUrl); + var request = new RestRequest("success"); + + var task = client.GetTaskAsync(request); + task.Wait(); + Assert.Equal("Works!", task.Result.Message); } } @@ -148,7 +164,7 @@ public void Handles_GET_Request_Errors_TaskAsync_With_Response_Type() var task = client.ExecuteTaskAsync(request); task.Wait(); - Assert.Null(task.Result); + Assert.Null(task.Result.Data); } } diff --git a/RestSharp/IRestClient.cs b/RestSharp/IRestClient.cs index 476f20c1a..77010f317 100644 --- a/RestSharp/IRestClient.cs +++ b/RestSharp/IRestClient.cs @@ -130,21 +130,21 @@ public interface IRestClient /// Target deserialization type /// Request to be executed /// The cancellation token - Task ExecuteTaskAsync(IRestRequest request, CancellationToken token); + Task> ExecuteTaskAsync(IRestRequest request, CancellationToken token); /// /// Executes the request asynchronously, authenticating if needed /// /// Target deserialization type /// Request to be executed - Task ExecuteTaskAsync(IRestRequest request); + Task> ExecuteTaskAsync(IRestRequest request); /// /// Executes a GET-style request asynchronously, authenticating if needed /// /// Target deserialization type /// Request to be executed - Task ExecuteGetTaskAsync(IRestRequest request); + Task> ExecuteGetTaskAsync(IRestRequest request); /// /// Executes a GET-style request asynchronously, authenticating if needed @@ -152,14 +152,14 @@ public interface IRestClient /// Target deserialization type /// Request to be executed /// The cancellation token - Task ExecuteGetTaskAsync(IRestRequest request, CancellationToken token); + Task> ExecuteGetTaskAsync(IRestRequest request, CancellationToken token); /// /// Executes a POST-style request asynchronously, authenticating if needed /// /// Target deserialization type /// Request to be executed - Task ExecutePostTaskAsync(IRestRequest request); + Task> ExecutePostTaskAsync(IRestRequest request); /// /// Executes a POST-style request asynchronously, authenticating if needed @@ -167,7 +167,7 @@ public interface IRestClient /// Target deserialization type /// Request to be executed /// The cancellation token - Task ExecutePostTaskAsync(IRestRequest request, CancellationToken token); + Task> ExecutePostTaskAsync(IRestRequest request, CancellationToken token); /// /// Executes the request and callback asynchronously, authenticating if needed diff --git a/RestSharp/RestClient.Async.cs b/RestSharp/RestClient.Async.cs index ae215124a..6b57128fa 100644 --- a/RestSharp/RestClient.Async.cs +++ b/RestSharp/RestClient.Async.cs @@ -164,9 +164,9 @@ private void DeserializeResponse(IRestRequest request, Action /// Target deserialization type /// Request to be executed - public virtual Task ExecuteGetTaskAsync(IRestRequest request) + public virtual Task> ExecuteGetTaskAsync(IRestRequest request) { - return this.ExecuteGetTaskAsync(request, CancellationToken.None); + return ExecuteGetTaskAsync(request, CancellationToken.None); } /// @@ -175,7 +175,7 @@ public virtual Task ExecuteGetTaskAsync(IRestRequest request) /// Target deserialization type /// Request to be executed /// The cancellation token - public virtual Task ExecuteGetTaskAsync(IRestRequest request, CancellationToken token) + public virtual Task> ExecuteGetTaskAsync(IRestRequest request, CancellationToken token) { if (request == null) { @@ -191,9 +191,9 @@ public virtual Task ExecuteGetTaskAsync(IRestRequest request, Cancellation /// /// Target deserialization type /// Request to be executed - public virtual Task ExecutePostTaskAsync(IRestRequest request) + public virtual Task> ExecutePostTaskAsync(IRestRequest request) { - return this.ExecutePostTaskAsync(request, CancellationToken.None); + return ExecutePostTaskAsync(request, CancellationToken.None); } /// @@ -202,7 +202,7 @@ public virtual Task ExecutePostTaskAsync(IRestRequest request) /// Target deserialization type /// Request to be executed /// The cancellation token - public virtual Task ExecutePostTaskAsync(IRestRequest request, CancellationToken token) + public virtual Task> ExecutePostTaskAsync(IRestRequest request, CancellationToken token) { if (request == null) { @@ -218,7 +218,7 @@ public virtual Task ExecutePostTaskAsync(IRestRequest request, Cancellatio /// /// Target deserialization type /// Request to be executed - public virtual Task ExecuteTaskAsync(IRestRequest request) + public virtual Task> ExecuteTaskAsync(IRestRequest request) { return ExecuteTaskAsync(request, CancellationToken.None); } @@ -229,18 +229,18 @@ public virtual Task ExecuteTaskAsync(IRestRequest request) /// Target deserialization type /// Request to be executed /// The cancellation token - public virtual Task ExecuteTaskAsync(IRestRequest request, CancellationToken token) + public virtual Task> ExecuteTaskAsync(IRestRequest request, CancellationToken token) { if (request == null) { throw new ArgumentNullException("request"); } - var taskCompletionSource = new TaskCompletionSource(); + var taskCompletionSource = new TaskCompletionSource>(); try { - var async = this.ExecuteAsync(request, (response, _) => + var async = ExecuteAsync(request, (response, _) => { if (token.IsCancellationRequested) { @@ -256,7 +256,7 @@ public virtual Task ExecuteTaskAsync(IRestRequest request, CancellationTok } else { - taskCompletionSource.TrySetResult(response.Data); + taskCompletionSource.TrySetResult(response); } }); diff --git a/RestSharp/RestClientExtensions.cs b/RestSharp/RestClientExtensions.cs index 10f0e96df..c11776c7f 100644 --- a/RestSharp/RestClientExtensions.cs +++ b/RestSharp/RestClientExtensions.cs @@ -1,5 +1,6 @@ using System; using System.Linq; +using System.Threading.Tasks; namespace RestSharp { @@ -106,11 +107,54 @@ public static RestRequestAsyncHandle PatchAsync(this IRestClient client, IRestRe return client.ExecuteAsync(request, callback); } - public static RestRequestAsyncHandle DeleteAsync(this IRestClient client, IRestRequest request, Action callback) - { - request.Method = Method.DELETE; - return client.ExecuteAsync(request, callback); - } + public static RestRequestAsyncHandle DeleteAsync(this IRestClient client, IRestRequest request, Action callback) + { + request.Method = Method.DELETE; + return client.ExecuteAsync(request, callback); + } + +#if NET4 + public static Task GetTaskAsync(this IRestClient client, IRestRequest request) where T : new() + { + return client.ExecuteGetTaskAsync(request).ContinueWith(x => x.Result.Data); + } + + public static Task PostTaskAsync(this IRestClient client, IRestRequest request) where T : new() + { + return client.ExecutePostTaskAsync(request).ContinueWith(x => x.Result.Data); + } + + public static Task PutTaskAsync(this IRestClient client, IRestRequest request) where T : new() + { + request.Method = Method.PUT; + return client.ExecuteTaskAsync(request).ContinueWith(x => x.Result.Data); + } + + public static Task HeadTaskAsync(this IRestClient client, IRestRequest request) where T : new() + { + request.Method = Method.HEAD; + return client.ExecuteTaskAsync(request).ContinueWith(x => x.Result.Data); + } + + public static Task OptionsTaskAsync(this IRestClient client, IRestRequest request) where T : new() + { + request.Method = Method.OPTIONS; + return client.ExecuteTaskAsync(request).ContinueWith(x => x.Result.Data); + } + + public static Task PatchTaskAsync(this IRestClient client, IRestRequest request) where T : new() + { + request.Method = Method.PATCH; + return client.ExecuteTaskAsync(request).ContinueWith(x => x.Result.Data); + } + + public static Task DeleteTaskAsync(this IRestClient client, IRestRequest request) where T : new() + { + request.Method = Method.DELETE; + return client.ExecuteTaskAsync(request).ContinueWith(x => x.Result.Data); + } +#endif + #if FRAMEWORK public static IRestResponse Get(this IRestClient client, IRestRequest request) where T : new() { @@ -148,11 +192,11 @@ public static RestRequestAsyncHandle DeleteAsync(this IRestClient client, IRestR return client.Execute(request); } - public static IRestResponse Delete(this IRestClient client, IRestRequest request) where T : new() - { - request.Method = Method.DELETE; - return client.Execute(request); - } + public static IRestResponse Delete(this IRestClient client, IRestRequest request) where T : new() + { + request.Method = Method.DELETE; + return client.Execute(request); + } public static IRestResponse Get(this IRestClient client, IRestRequest request) { @@ -190,11 +234,11 @@ public static IRestResponse Patch(this IRestClient client, IRestRequest request) return client.Execute(request); } - public static IRestResponse Delete(this IRestClient client, IRestRequest request) - { - request.Method = Method.DELETE; - return client.Execute(request); - } + public static IRestResponse Delete(this IRestClient client, IRestRequest request) + { + request.Method = Method.DELETE; + return client.Execute(request); + } #endif /// @@ -214,20 +258,20 @@ public static void AddDefaultParameter(this IRestClient restClient, Parameter p) restClient.DefaultParameters.Add(p); } - /// - /// Removes a parameter from the default parameters that are used on every request made with this client instance - /// - /// The IRestClient instance - /// The name of the parameter that needs to be removed - /// - public static void RemoveDefaultParameter(this IRestClient restClient, string name) - { - var parameter = restClient.DefaultParameters.SingleOrDefault(p => p.Name.Equals(name, StringComparison.OrdinalIgnoreCase)); - if (parameter != null) - { - restClient.DefaultParameters.Remove(parameter); - } - } + /// + /// Removes a parameter from the default parameters that are used on every request made with this client instance + /// + /// The IRestClient instance + /// The name of the parameter that needs to be removed + /// + public static void RemoveDefaultParameter(this IRestClient restClient, string name) + { + var parameter = restClient.DefaultParameters.SingleOrDefault(p => p.Name.Equals(name, StringComparison.OrdinalIgnoreCase)); + if (parameter != null) + { + restClient.DefaultParameters.Remove(parameter); + } + } /// /// Adds a HTTP parameter (QueryString for GET, DELETE, OPTIONS and HEAD; Encoded form for POST and PUT)