2012-01-29 1 views
0

Je suis actuellement en train d'écrire une bibliothèque C# pour utiliser cross platform sur Windows, iOS, Android. Je consomme un service de repos et j'ai des problèmes avec les objets renvoyés par la réponse. J'utilise RestSharp pour les appels api. J'ai utilisé Xsd2Code.NET pour générer mes classes à partir d'un fichier xsd fourni par l'API.RestSharp consommant SubSonic REST Api

Le problème est que les réponses sont enveloppées dans un <subsonic-response>. L'article que je veux est contenu dedans. RestSharp essaie d'analyser et fait si je passe dans le type en tant que List<NowPlaying> mais les éléments à l'intérieur ne sont pas remplis à l'objet NowPlaying. J'ai généré les méthodes serialize/deserialize pour NowPlaying mais en raison du <subsonic-response> en tant qu'élément racine, une exception est levée. Est-il un moyen de supprimer <subsonic-response>? J'ai essayé response.RootElement = "subsonic-response" pour l'appel RestSharp mais ne fonctionne pas. Voir la réponse ci-dessous. Toute aide est la bienvenue.

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> 

Une classe qui a été généré:

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"); 
      } 
     } 
    } 
} 

Ma méthode que je vous appelle pour obtenir le NowPlaying du service de repos

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; 

    } 

Répondre

0

a résolu mon problème. Le résultat final était de ne pas laisser RestSharp désérialiser mon objet. Obtenez le contenu RestResponse qui est la réponse XML. Désérialisez ensuite l'objet Response pour l'API. J'ai récupéré le response.item et l'ai casté à mon objet NowPlaying et toutes les données étaient dans l'objet.

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

La structure générale pour une classe C# qui correspondent à ce schéma est la suivante:

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; } 
    ... 
} 

Ensuite, vous pouvez appeler Execute<SubsonicResource>() et il devrait être peuplé.