private Task <HttpResponseMessage> SendLambdaAsync(Lambda lambda, IAPIClientInterceptor interceptor) { if (lambda == null) { throw new ArgumentNullException(nameof(lambda)); } if (interceptor == null) { throw new ArgumentNullException(nameof(interceptor)); } var methodInfo = lambda.MethodInfo; var parameters = lambda.CreateParameters(APIClientParameterInfo.Make); if (!(Attribute.GetCustomAttribute(methodInfo, typeof(APIClientAttribute)) is APIClientAttribute methodAttribute)) { throw new NotSupportedException($"APICall attribute is missing from Method signature"); } var url = methodAttribute.URL; var method = new HttpMethod(methodAttribute.Method); var builder = new StringBuilder(url); BindParameters(parameters, url, builder); BindQuery(parameters, url, builder); var request = new HttpRequestMessage() { RequestUri = new Uri(builder.ToString(), default(UriKind)), Method = method, }; var body = parameters.SingleOrDefault(x => x.IsHandled); interceptor.Prepare(request, Environment, body); return(SendAsync(request)); }
public async Task <TResult> SendAsync <TResult>(Expression <Func <T, TResult> > func, IAPIClientInterceptor interceptor = null) { if (func == null) { throw new ArgumentNullException(nameof(func)); } if (interceptor == null) { interceptor = Interceptor; } var lambda = Lambda.Compose(func); var msg = await SendLambdaAsync(lambda, interceptor); msg.EnsureSuccessStatusCode(); if (msg as object is TResult result) { return(result); } return(await msg.ToObjectAsync <TResult>(Environment.MediaTypeFormatters)); }