diff options
Diffstat (limited to 'Services')
-rw-r--r-- | Services/CurrencyClient.cs | 42 | ||||
-rw-r--r-- | Services/ICurrencyClient.cs | 6 |
2 files changed, 48 insertions, 0 deletions
diff --git a/Services/CurrencyClient.cs b/Services/CurrencyClient.cs new file mode 100644 index 0000000..ee6998b --- /dev/null +++ b/Services/CurrencyClient.cs @@ -0,0 +1,42 @@ +using System.Diagnostics; +using System.Text; +using System.Xml.Linq; + +namespace ExcelAddIn.Services; + +public class CurrencyClient : ICurrencyClient +{ + private readonly HttpClient _httpClient; + private const string _requestAddress = @"https://www.cbr.ru/scripts/XML_daily.asp?date_req="; + + public CurrencyClient(HttpClient httpClient) + { + _httpClient = httpClient; + } + + public async Task<decimal?> GetCurrencyCourse(DateTime date) + { + string request = $"{_requestAddress}{date.Date:dd/MM/yyyy}"; + + HttpResponseMessage response = await _httpClient.GetAsync(request); + try + { + response.EnsureSuccessStatusCode(); + var bytes = await response.Content.ReadAsByteArrayAsync(); + var xml = Encoding.GetEncoding(1251).GetString(bytes); + + XElement valCourses = XElement.Parse(xml); + + decimal? exchangeRate = decimal.Parse(valCourses.Elements("Valute") + .Where(e => e.Element("Name").Value == "Евро") + .FirstOrDefault() + .Element("Value").Value); + return exchangeRate; + } + catch (Exception ex) + { + Debug.WriteLine(ex.Message); + return null; + } + } +} diff --git a/Services/ICurrencyClient.cs b/Services/ICurrencyClient.cs new file mode 100644 index 0000000..1e10473 --- /dev/null +++ b/Services/ICurrencyClient.cs @@ -0,0 +1,6 @@ +namespace ExcelAddIn.Services; + +public interface ICurrencyClient +{ + public Task<decimal?> GetCurrencyCourse(DateTime date); +} |