Exemple #1
0
        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));
        }
Exemple #2
0
        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));
        }