Restsharp десериализует ошибки на стороне сервера

Ошибка обработки вопроса RestSharp.

Если у меня есть ошибка в самом запросе, сервер возвращает другой ответ Json, который должен быть распечатан для другого объекта POCO. Где я могу справиться с этим?

Например, нормальный ответ:

{status: 100, message: { ** list of items ** }}

Ошибка ответа:

{status: 404, message: { ** error details ** }}

Итак, это 2 разных POCO (хотя может иметь один родитель со статусом), поэтому их следует анализировать по-разному (было бы идеально, если бы я мог читать статус и выбирать, как десериализовать результат).

Я использую RestSharp с асинхронной библиотекой wp7, поэтому я вижу запрос как

var response = await client.ExecuteAsync<NormalPOCO, ErrorPOCO>(request);

но где я могу переопределить саму десериализацию?


person Vitalii Vasylenko    schedule 30.04.2013    source источник


Ответы (2)


Я бы придерживался RestSharp, хотя он не поддерживает такого рода условную десериализацию.

class StatusPOCO { public int Status { get; set; } }
class NormalPOCO : StatusPOCO { ... }
class ErrorPOCO : StatusPOCO { ... }

var response = await client.ExecuteAsync<StatusPOCO>(request);
// restsharp's deserializer:
IDeserializer deserializer = new JsonDeserializer();
if (response.Data.status != 100)
   error = deserializer.Deserialize<ErrorPOCO>(response);
else
   normal = deserializer.Deserialize<NormalPOCO>(response);
person lisp    schedule 17.07.2013

В итоге я отправил запрос вручную через HttpWebRequest +, используя async и Json.net. Это выглядит так

        var stringResult = await productSearchDataService.LaunchSearchAsync(name, label); // Sends HttpWebRequest
        if (String.IsNullOrEmpty(stringResult )) { return; }     // TODO: notify no internet
        var status = (int)JObject.Parse(stringResult)["status"];            
        if (status != 100) { return; }            // TODO: notify some shit happened
        try
        {
            private var parsedResult = await TaskEx.Run(() => JsonConvert.DeserializeObject<NormalAnswerPoco>(stringResult));

        ***
        }
person Vitalii Vasylenko    schedule 02.05.2013