2013-05-13 10 views
5

Mam dość ogólny serwis internetowy, który odpowiada wieloma standardowymi stanami http. Jednakże zwraca różne typy według tych statusów. Jest to całkowicie poprawna implementacja REST: Dostaję encję Person o statusie 200 (OK), ale gdy wystąpi błąd, na przykład problem auth, otrzymuję 403 (Forbidden) z listą komunikatów o błędach (stwierdzenie, że token wygasł lub moje konto jest nieaktywny, itp.).Użyj RestSharp do deserializacji różnych danych wyjściowych z jednego zasobu

Niestety, używając RestSharp mogę tylko „przypisane” do jednego typu danych, które należy się spodziewać:

client.ExecuteAsync<Person>(request, (response) => 
    { 
     callback(response.Data); 
    }); 

Jak należy przechwytywać komunikaty o błędach, gdy stan jest inny niż 200? Oczywiście, mógłbym to zrobić ręcznie i zdywersyfikować zawartość odpowiedzi samodzielnie, ale myślę, że powinien istnieć jakiś czystszy, lepszy sposób, aby to osiągnąć. Chciałbym użyć czegoś takiego:

client.ExecuteAsync<Person, ErrorList>(request, (response) => 
    { 
     if (response.StatusCode == HttpStatusCode.OK) 
     { 
      Callback(response.Data); 
     } 
     else if (response.StatusCode == HttpStatusCode.OK) 
     { 
      ErrorCallback(response.Errors); 
     } 
    }); 

Odpowiedz

3

Sposób, w jaki zawsze to robiłem, polega na napisaniu post procesora w odpowiedzi na ostry atak. coś takiego,

public class Response<T> 
{ 
    public T Data {get;set;} 
    public List<Error> Errors {get;set;} 
} 

public static Response<T> GetResponse<T>(this IRestResponse restResponse) 
{ 
     var response = new Response<T>(); 

     if (response.StatusCode == HttpStatusCode.OK) 
     { 
      response.Data = JsonConvert.DeserilizeObject<T>(restResponse.Data) 
     } 

     response.Errors =JsonConvert.DeserilizeObject<List<Error>>(restResponse.Error) 

     return response; 
} 

i można go używać tak,

var response = client.Execute(request).GetResponse<T>(); 
+0

Więc w zasadzie to deserializacji ręcznie. Jednak metoda rozszerzenia jest dobrym wyborem, nie myślałem o tym. – jacek

+0

Więc to zakłada, że ​​twój interfejs API zwraca JSON w postaci tablicy danych i błędów? –

Powiązane problemy