using System.Xml; using System.Xml.Serialization; namespace YandexMusic.API.Requests.Common; /// /// Строитель запросов с десериализацией XML-ответа в TResponse. /// internal abstract class YXmlRequestBuilder : YRequestBuilder { protected YXmlRequestBuilder(YandexMusicApi api) : base(api) { } /// /// Десериализует XML-ответ в объект типа TResponse. /// protected virtual async Task DeserializeAsync(HttpResponseMessage response) { var xml = await response.Content.ReadAsStringAsync(); if (!response.IsSuccessStatusCode) { // Для XML-ошибок можно создать отдельную модель, но для простоты выбрасываем исключение throw new Exception($"Ошибка HTTP {response.StatusCode}: {xml}"); } try { using var stringReader = new StringReader(xml); using var xmlReader = XmlReader.Create(stringReader, new XmlReaderSettings { Async = true }); var serializer = new XmlSerializer(typeof(TResponse)); return (TResponse?)serializer.Deserialize(xmlReader); } catch (Exception ex) { throw new Exception($"Ошибка десериализации XML: {ex.Message}\nXML: {xml}", ex); } } /// /// Выполняет запрос и возвращает десериализованный объект типа TResponse. /// public async Task ExecuteAsync(TParams parameters) { using var response = await ExecuteRawAsync(parameters); return await DeserializeAsync(response); } }