private void BuildMethodParameters(StringBuilder apiRequestUrl, ApiMethod method) { foreach (var parameter in method.MethodParameters) { apiRequestUrl.Append(parameter.Value); apiRequestUrl.Append("/"); } }
private void BuildApiParameters(StringBuilder apiRequestUrl, ApiMethod method) { foreach (var parameter in method.ApiParameters) { if (parameter.CheckIsApiParameterAllowed()) { apiRequestUrl.Append(parameter.AsUriChunk()); } } }
public Uri GetApiMethodUrl(ApiMethod method) { if (method == null) { throw new ArgumentNullException(nameof(method)); } var apiRequestUrl = BuildApiRequestUrl(method); return(new Uri(apiRequestUrl.ToString())); }
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); }
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); }
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)); }
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); } } } }