RestSharp потребляющий SubSonic REST Api - PullRequest
0 голосов
/ 29 января 2012

В настоящее время я пишу библиотеку ac # для использования кроссплатформенности на Windows, iOS, Android.Я использую службу отдыха и у меня возникли проблемы с объектами, возвращаемыми из ответа.Я использую RestSharp для вызовов API.Я использовал Xsd2Code.NET для генерации своих классов из xsd, предоставленного API.

Проблема в том, что ответы заключаются в <subsonic-response>.Элемент, который я хочу, содержится внутри.RestSharp пытается выполнить синтаксический анализ и делает, если я передаю тип как List<NowPlaying>, но элементы внутри него не заполняются объектом NowPlaying.Я создал методы сериализации / десериализации для NowPlaying, но из-за <subsonic-response> в качестве корневого элемента выдается исключение.Есть ли способ удалить <subsonic-response>?Я попытался response.RootElement = "subsonic-response" для вызова RestSharp, но не работает.Смотрите ответ ниже.Любая помощь будет отличной.

RestResponse:

<?xml version="1.0" encoding="UTF-8"?>
<subsonic-response xmlns="http://subsonic.org/restapi" status="ok" version="1.7.0">
<nowPlaying>
    <entry     id="503a5c4d757369635c4a616e20326b31325c444a20434852495354554646204449204d414420595554452046524f4d2052454e41495353414e43452050524553454e5453204d3320284d454d4241204d45204d4141442920324b31325c444a20434852495354554646204449204d414420595554452046524f4d2052454e41495353414e43452050524553454e5453204d332020284d454d4241204d45204d4141442920324b31325c38372e2044616e63652044616e63652028445542535445502052454d495829202d20426967205365616e2e6d7033" parent="503a5c4d757369635c4a616e20326b31325c444a20434852495354554646204449204d414420595554452046524f4d2052454e41495353414e43452050524553454e5453204d3320284d454d4241204d45204d4141442920324b31325c444a20434852495354554646204449204d414420595554452046524f4d2052454e41495353414e43452050524553454e5453204d332020284d454d4241204d45204d4141442920324b3132" 
title="Dance Dance (DUBSTEP REMIX) - Big Sean" 
isDir="false" 
album="M3 MIXTAPE (MEMBA. ME. MAAD)" 
artist="DJ CHRISTUFF DI MAD YUTE FROM RENAISSANCE"
duration="67"
bitRate="192"
year="2012"
size="1615419" 
suffix="mp3" 
contentType="audio/mpeg" 
isVideo="false"
coverArt="503a5c4d757369635c4a616e20326b31325c444a20434852495354554646204449204d414420595554452046524f4d2052454e41495353414e43452050524553454e5453204d3320284d454d4241204d45204d4141442920324b31325c444a20434852495354554646204449204d414420595554452046524f4d2052454e41495353414e43452050524553454e5453204d332020284d454d4241204d45204d4141442920324b31325c444a20434852495354554646202d204d454d4241204d45204d4141442046524f4e542e6a7067"
 path="Jan 2k12/DJ CHRISTUFF DI MAD YUTE FROM RENAISSANCE PRESENTS M3 (MEMBA ME MAAD) 2K12/DJ CHRISTUFF DI MAD YUTE FROM RENAISSANCE PRESENTS M3  (MEMBA ME MAAD) 2K12/87. Dance Dance (DUBSTEP REMIX) - Big Sean.mp3" 
username="admin" 
playerId="2" 
playerName="subAir"
minutesAgo="0"/>
 </nowPlaying>
</subsonic-response>

Созданный класс:

public partial class NowPlaying : EntityBase<NowPlaying>
{

    [EditorBrowsable(EditorBrowsableState.Never)]
    private List<NowPlayingEntry> entryField;

    public List<NowPlayingEntry> entry
    {
        get
        {
            if ((this.entryField == null))
            {
                this.entryField = new List<NowPlayingEntry>();
            }
            return this.entryField;
        }
        set
        {
            if ((this.entryField != null))
            {
                if ((entryField.Equals(value) != true))
                {
                    this.entryField = value;
                    this.OnPropertyChanged("entry");
                }
            }
            else
            {
                this.entryField = value;
                this.OnPropertyChanged("entry");
            }
        }
    }
}

Мой метод, который я вызываю, чтобы получить NowPlaying от остальныхуслуга

    public NowPlaying getNowPlaying()
    {
        NowPlaying playing;
        try
        {
            var request = new RestRequest();
            request.Resource = "getNowPlaying.view";
            playing = SendRequest<NowPlaying>(request);

        }
        catch (Exception ex)
        {

            throw ex;
        }

        return playing;

    }

Ответы [ 2 ]

0 голосов
/ 02 февраля 2012

Общая структура класса C #, которая будет соответствовать этой схеме, такова:

public class SubsonicResource {
    public List<entry> NowPlaying { get; set; }
}

public class entry {
    public string Id { get; set; }
    public string Path { get; set; }
    public string Username { get; set; }
    ... 
}

Тогда вы можете позвонить Execute<SubsonicResource>(), и он должен быть заполнен.

0 голосов
/ 30 января 2012

Решил мою проблему.Конечным результатом было не позволить RestSharp десериализовать мой объект.Получите содержимое RestResponse, которое является ответом xml.Затем десериализуйте объект Response для API.Схватил элемент response.item и привел его к моему объекту NowPlaying, и все данные были в объекте.

string xml = SendRequest(request);
var res = Response.Deserialize(xml);
playing =(NowPlaying)res.Item;
...