Esempio n. 1
0
 private void BuildMethodParameters(StringBuilder apiRequestUrl, ApiMethod method)
 {
     foreach (var parameter in method.MethodParameters)
     {
         apiRequestUrl.Append(parameter.Value);
         apiRequestUrl.Append("/");
     }
 }
Esempio n. 2
0
 private void BuildApiParameters(StringBuilder apiRequestUrl, ApiMethod method)
 {
     foreach (var parameter in method.ApiParameters)
     {
         if (parameter.CheckIsApiParameterAllowed())
         {
             apiRequestUrl.Append(parameter.AsUriChunk());
         }
     }
 }
Esempio n. 3
0
        public Uri GetApiMethodUrl(ApiMethod method)
        {
            if (method == null)
            {
                throw new ArgumentNullException(nameof(method));
            }

            var apiRequestUrl = BuildApiRequestUrl(method);

            return(new Uri(apiRequestUrl.ToString()));
        }
Esempio n. 4
0
        private StringBuilder BuildApiRequestUrl(ApiMethod method)
        {
            var apiRequestUrl = new StringBuilder();

            apiRequestUrl.Append(WykopConstants.AppDomain);
            apiRequestUrl.Append(method.Url);
            apiRequestUrl.Append("/");

            BuildMethodParameters(apiRequestUrl, method);
            BuildApiParameters(apiRequestUrl, method);

            apiRequestUrl.Append("appkey,");
            apiRequestUrl.Append(_appKey);
            return(apiRequestUrl);
        }
Esempio n. 5
0
        private MultipartFormDataContent BuilPostContent(ApiMethod method)
        {
            var content = new MultipartFormDataContent();

            foreach (var p in method.PostParameters)
            {
                if (p is StringPostParameter)
                {
                    content.Add(p.AsHttpContent, p.Name);
                }
                else if (p is BytePostParameter)
                {
                    var file = (BytePostParameter)p;
                    content.Add(file.AsHttpContent, file.Name, file.FileName);
                }
            }
            return(content);
        }
Esempio n. 6
0
        public async Task <TResult> CallApiMethod <TResponse, TResult>(ApiMethod method, Func <TResponse, TResult> callback,
                                                                       IEnumerable <JsonConverter> converters = null)
            where TResult : class
            where TResponse : class
        {
            if (_disposed)
            {
                throw new ObjectDisposedException("WykopClient");
            }
            if (method == null)
            {
                throw new ArgumentNullException(nameof(method));
            }

            var response = await CallApiMethod <TResponse>(method, converters).ConfigureAwait(false);

            return(callback(response));
        }
Esempio n. 7
0
        public async Task <TResult> CallApiMethod <TResult>(ApiMethod method, IEnumerable <JsonConverter> converters = null)
            where TResult : class
        {
            if (_disposed)
            {
                throw new ObjectDisposedException("WykopClient");
            }
            if (method == null)
            {
                throw new ArgumentNullException(nameof(method));
            }

            var apiRequestUrl = BuildApiRequestUrl(method);

            using (var request = new HttpRequestMessage(method.HttpMethod, apiRequestUrl.ToString()))
            {
                AuthSignature signature;
                AddRequestHeader(request);

                if (method.HttpMethod == HttpMethod.Get)
                {
                    signature = new AuthSignature(_appSecret, request.RequestUri);
                }
                else if (method.HttpMethod == HttpMethod.Post)
                {
                    signature       = new AuthSignature(_appSecret, request.RequestUri, method.PostParameters);
                    request.Content = BuilPostContent(method);
                }
                else
                {
                    throw new UnsupportedHttpMethodException("Http method {method.HttpMethod} is not supported");
                }

                var hash = signature.FetchSignature();
                request.Headers.Add("apisign", hash);

                using (var response = await _client.SendAsync(request, CancellationToken.None).ConfigureAwait(false))
                {
                    if (!response.IsSuccessStatusCode)
                    {
                        throw new InvalidResponseException("Response is not success. ", 0);
                    }

                    var stringResponse = response.Content.ReadAsStringAsync().Result;
                    var responseType   = CheckResponseType(stringResponse, response);
                    ValidateErrors(stringResponse);

                    switch (responseType)
                    {
                    case ResponseType.Unsupported:
                    case ResponseType.Json:
                        break;

                    case ResponseType.Html:
                        return((dynamic) new HtmlResponse()
                        {
                            Html = stringResponse
                        });

                    case ResponseType.ValueArray:
                        // API is incosistent - return array with boolean,
                        // but i don't know is that the only one behaviour
                        var booleanResult = new BooleanModel();
                        booleanResult.Success = stringResponse.Contains("true") ? true : false;
                        return((dynamic)booleanResult);
                    }

                    using (var reader = new JsonTextReader(new StringReader(stringResponse)))
                    {
                        var serializer = CreateSerializer(converters);
                        var result     = serializer.Deserialize <TResult>(reader);

                        return(result);
                    }
                }
            }
        }