47 lines
1.8 KiB
C#
47 lines
1.8 KiB
C#
using System.Xml;
|
||
using System.Xml.Serialization;
|
||
|
||
namespace YandexMusic.API.Requests.Common;
|
||
|
||
/// <summary>
|
||
/// Строитель запросов с десериализацией XML-ответа в TResponse.
|
||
/// </summary>
|
||
internal abstract class YXmlRequestBuilder<TResponse, TParams> : YRequestBuilder<TParams>
|
||
{
|
||
protected YXmlRequestBuilder(YandexMusicApi api) : base(api) { }
|
||
|
||
/// <summary>
|
||
/// Десериализует XML-ответ в объект типа TResponse.
|
||
/// </summary>
|
||
protected virtual async Task<TResponse?> 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);
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// Выполняет запрос и возвращает десериализованный объект типа TResponse.
|
||
/// </summary>
|
||
public async Task<TResponse?> ExecuteAsync(TParams parameters)
|
||
{
|
||
using var response = await ExecuteRawAsync(parameters);
|
||
return await DeserializeAsync(response);
|
||
}
|
||
} |