private string CreateUnsignedRequest(RequestParametersModel requestParametersModel) { _logger.Info("Start creatting unsigned request."); _logger.Info("Getting AWSAccessKeyIdPublic and AssociateTag values from section: appSettings of web.config."); string awsAccessKeyIdPublic = Settings.Default.AWSAccessKeyIdPublic; string associateTag = Settings.Default.AssociateTag; var timeStamp = DateTime.UtcNow.AddDays(1).ToString("yyyy-MM-ddT12:00:00.000Z"); _logger.Info("Creatting collection of parameters using to compose request."); var parameters = new SortedDictionary <string, string>(new StringComparerByByte()) { { "Service", "AWSECommerceService" }, { "AWSAccessKeyId", $"{awsAccessKeyIdPublic}" }, { "AssociateTag", $"{associateTag}" }, { "Operation", "ItemSearch" }, { "SearchIndex", "Electronics" }, { "BrowseNode", "493964" }, // 172282 493964 2102313011 { "ResponseGroup", "Images,ItemAttributes,OfferSummary,BrowseNodes" }, { "Availability", "Available" }, { "Condition", "New" }, { "MinPercentageOff", "10" }, { "MinimumPrice", $"{requestParametersModel.MinPrice}" }, { "MaximumPrice", $"{requestParametersModel.MaxPrice}" }, { "Sort", "price" }, { "ItemPage", $"{requestParametersModel.Page}" }, { "Timestamp", $"{timeStamp}" } }; // Parameters with percent-encoding values. See RFC 3986 Section 2.1. var parametersEncoded = new Dictionary <string, string>(); var regex = new Regex(@"%[a-f0-9]{2}"); _logger.Info("Replacing specific signs to percent-encoding."); foreach (var p in parameters) { var key = p.Key; var valueLower = HttpUtility.UrlEncode(p.Value); var value = regex.Replace(valueLower, n => n.Value.ToUpperInvariant()); parametersEncoded.Add(key, value); } var unsignedRequest = new StringBuilder(); _logger.Info($"Creatting {nameof(unsignedRequest)} that contains key=value pairs that have been divided via sign &."); foreach (var p in parametersEncoded) { unsignedRequest.Append($"{p.Key}={p.Value}&"); } _logger.Info($"{nameof(unsignedRequest)} has been created successfully."); return(unsignedRequest.ToString().TrimEnd('&')); }
/// <inheritdoc /> public string CreateSignedRequest(RequestParametersModel requestParametersModel) { // Creating unsigned request string. var unsignedRequest = this.CreateUnsignedRequest(requestParametersModel); _logger.Info("Start creatting signed request."); // Endpoint for US server. const string endpoint = "http://webservices.amazon.com/onca/xml?"; _logger.Info("Creatting request to sign."); var requestToSign = "GET\n" + "webservices.amazon.com\n" + "/onca/xml\n" + unsignedRequest; _logger.Info("Getting AWSAccessKeyIdPrivate value from section: appSettings of web.config."); string awsAccessKeyIdPrivate = Settings.Default.AWSAccessKeyIdPrivate; _logger.Info($"Converting {nameof(awsAccessKeyIdPrivate)} and {nameof(requestToSign)} " + $"to byte's array."); var secretKeyBytes = new ASCIIEncoding().GetBytes(awsAccessKeyIdPrivate); var unsignedRequestBytes = new ASCIIEncoding().GetBytes(requestToSign); _logger.Info("Encrypting string with secret key."); var signatureBytes = new HMACSHA256(secretKeyBytes) .ComputeHash(unsignedRequestBytes); // Recommendation from Amazon's helper page. var signature = Convert.ToBase64String(signatureBytes); var signatureEncodedLower = HttpUtility.UrlEncode(signature); _logger.Info("Replacing specific signs to percent-encoding."); var regex = new Regex(@"%[a-f0-9]{2}"); var signatureEncoded = regex.Replace(signatureEncodedLower, n => n.Value.ToUpperInvariant()); _logger.Info("Composing the signed request."); var signedRequest = endpoint + unsignedRequest + $"&Signature={signatureEncoded}"; _logger.Info($"{nameof(signedRequest)} has been created successfully."); return(signedRequest); }
/// <inheritdoc /> public async Task <IReadOnlyCollection <GoodDomainModel> > GetItemInfoByUrlAsync(RequestParametersModel requestParametersModel) { var signedRequest = this._signedRequestCreatorService.CreateSignedRequest(requestParametersModel); //await Task.Delay(1000); string responseMessage; using (var client = new HttpClient()) { responseMessage = await client.GetStringAsync(signedRequest); } return(this.Parse(responseMessage)); }
/// <inheritdoc /> public async Task AddGoodsAsync(int minPrice) { // Looping with step that equals to 500 (5.00 dollar). for (; minPrice <= 50_000; minPrice += 500) { // Dividing price range into five equal ranges (step 50 or 0.5 dollar). for (int page = 1, minPriceDivide = minPrice, maxPrice = minPrice + 50; page <= 10; page++, minPriceDivide += 50, maxPrice += 50) { var requestParametersModel = new RequestParametersModel { Page = page, MinPrice = minPriceDivide, MaxPrice = maxPrice }; try { // Validating instance of type RequestParametersModel. this._requestParametersModelValidator.ValidateAndThrow(requestParametersModel); } catch (ValidationException ex) { throw new ArgumentException($"Error when validating {requestParametersModel}.", ex); } // Getting good's info from server and adding to collection. IReadOnlyCollection <GoodDomainModel> goodDomainModels; try { goodDomainModels = await this._amazonAdapter.GetItemInfoByUrlAsync(requestParametersModel); } catch (HttpRequestException ex) { throw new ArgumentException("Error when getting data from api server.", ex); } if (!goodDomainModels.Any()) { continue; } // Checking if good already exist into database. // Creating new collection without duplicates. var goodDomainModelsDeletedDuplicates = await this.CheckExistenceGoodInDb(goodDomainModels); // Checking if category already exist into database. // Creating new collection without duplicates. IReadOnlyCollection <CategoryDomainModel> categoryDomainModelsDeletedDuplicates = await this.CheckExistenceCategoryInDb(goodDomainModels.SelectMany(g => g.CategoryIdsOnShop)); // Adding collection of goods to database. if (goodDomainModelsDeletedDuplicates.Any()) { // Adding collection of categories to database. if (categoryDomainModelsDeletedDuplicates.Any()) { await this._categoryService.CreateCategoriesAsync( categoryDomainModelsDeletedDuplicates, goodDomainModelsDeletedDuplicates.First().ShopName); } await this._goodService.CreateAsync(goodDomainModelsDeletedDuplicates); } } } }
public IActionResult QuarterlyReport(RequestParametersModel parameters) { return(new ObjectResult(_getQuarterlyReport.GetDataSet(parameters))); }
public IActionResult UpdateChart(RequestParametersModel parameters) { var dateSummaryModels = _getTimeSeries.GetDataSet(parameters); return(new ObjectResult(dateSummaryModels)); }