2012-01-29 2 views
0

현재 Windows, iOS, Android에서 크로스 플랫폼을 사용하기 위해 C# 라이브러리를 작성 중입니다. Rest 서비스를 사용하고 응답에서 반환되는 객체에 문제가 발생했습니다. API 호출을 위해 RestSharp를 사용하고 있습니다. Xsd2Code.NET을 사용하여 API가 제공하는 xsd에서 클래스를 생성했습니다.RestSharp 소비 SubSonic REST API

문제는 응답이 포장되어 <subsonic-response>에 있습니다. 내가 원하는 항목은 안에 포함되어 있습니다. RestSharp는 구문 분석을 시도하고 유형을 List<NowPlaying>으로 전달하지만 그 안의 항목이 NowPlaying 객체로 채워지지 않습니다. 나는 NowPlaying에 대한 serialize/deserialize 메소드를 생성했으나 <subsonic-response> 루트 요소로 인해 예외가 발생합니다. <subsonic-response>을 삭제할 수있는 방법이 있습니까? 나는 RestSharp 호출에 대해 response.RootElement = "subsonic-response"를 시도했지만 작동하지 않습니다. 아래의 답변을 참조하십시오. 어떤 도움이라도 좋을 것입니다.

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 NowPlaying getNowPlaying() 
    { 
     NowPlaying playing; 
     try 
     { 
      var request = new RestRequest(); 
      request.Resource = "getNowPlaying.view"; 
      playing = SendRequest<NowPlaying>(request); 

     } 
     catch (Exception ex) 
     { 

      throw ex; 
     } 

     return playing; 

    } 

답변

0

에서 NowPlaying를 얻기 위해 호출 오전

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

내 방법. 최종 결과는 RestSharp가 내 개체를 deserialize하지 못하게하는 것이 었습니다. XML 응답 인 RestResponse 내용을 가져옵니다. 그런 다음 api에 대한 Response 객체의 비동기 화를 수행하십시오. response.item을 가져 와서 내 NowPlaying 객체에 캐스팅했고 모든 데이터가 객체에있었습니다.

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

그 스키마와 일치하는 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>()를 호출 할 수 있으며 채워 져야합니다.