Обработка ошибок / исключений Python в flex в запросах http - PullRequest
0 голосов
/ 15 марта 2012

Вот проблема, которую я сейчас пытаюсь решить в течение некоторого времени.
У меня есть бэкэнд Python + GAE с гибким клиентом, который общается через JSON.Я использую Flex HttpService, связанный с ответчиком с обратным вызовом результата и ошибки.

Когда python вызывает исключение, я не получаю его во флексе.Я провел некоторое исследование и выяснил, что проблема, вероятно, заключается в том, что среда выполнения флэш-памяти не может обрабатывать ответы http с кодом состояния, отличным от 200.

Так как же получить эти исключения в клиенте?

Спасибо

1 Ответ

1 голос
/ 16 марта 2012

TL; DR - поймать исключение в Python и отправить пользовательский объект JSON с сообщением, которое вы хотите отобразить клиенту, обратно во Flex.

Это шаблон Iследовать.Пример, который я собираюсь привести, находится на C #, но я предполагаю, что те же принципы могут быть применены к Python.

Я обрабатываю исключение в веб-сервисе и отправляю объект JSON, содержащий ошибку, которую я хотел бы отобразитьпользователю.

Здесь я ловлю ошибку:

try
{
    string jsonResponse = doStuff();

    return Json(jsonResponse, JsonRequestBehavior.AllowGet);
}
catch (Exception ex)
{
    return Json(new GetTokenError(ex.Message), JsonRequestBehavior.AllowGet);
}

Вот объект возврата, который я использую для преобразования в JSON и возврата клиенту:

/// <summary>
/// Used for displaying consistent error messages
/// </summary>
public class GetTokenError
{
    /// <summary>
    /// Ctor
    /// </summary>
    /// <param name="error">Error message to display</param>
    public GetTokenError(string error)
    {
        this.error = error;
    }

    /// <summary>
    /// The error to display
    /// </summary>
    public string error { get; set; }
}

Использование этого метода всегда возвращает 200, если с вашим веб-сервером не установлено что-то не так, соединение клиента и веб-сервера или гремлины не заразили вашу машину.

Что касается гибкой стороны, здесьобработчики моего результата:

var http:HTTPService = new HTTPService();
http.method = "POST";
http.resultFormat = HTTPService.RESULT_FORMAT_TEXT;
http.url = "http://url.com";
http.addEventListener(ResultEvent.RESULT, function(evt:ResultEvent):void {
    try {
        var ret:Object = JSON.decode(evt.result.toString());

        if (ret.error)
        {
            // handle server error
        }

        // go about task

    } catch (e:Error) {
        // handle local error
    }
});

http.addEventListener(FaultEvent.FAULT, function(ex:FaultEvent):void {
    // handle error with the call
});

http.send();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...