Обработка ошибок синтаксического анализа JSON сторонних сервисов в игровых приложениях

Мне интересно, какой приемлемый подход к анализу JSON от сторонних сервисов с учетом ошибок десериализации.

Например, этот метод обслуживания:

  def signInWithEmailAndPassword(email: String, password: String): Future[ApiResponse[SignInResponse]] =
    request("/signin").post(Json.obj("email" -> email, "password" -> password))
      .map(_.json.as[ApiResponse[SignInResponse]])

Вызовет исключение сервера, если json.as завершится ошибкой, которая будет обнаружена в обработчике ошибок по умолчанию.

Это нормальное структурирование клиента? Похоже, что ошибка синтаксического анализа JSON в любом случае не может быть восстановлена, поэтому подходит ли общий обработчик ошибок?


person tgk    schedule 03.01.2018    source источник


Ответы (2)


Предполагая, что ApiResponse будет содержать любые ошибки клиента (неправильный пароль и т. д.), а Future будет содержать ошибки сервера (не удалось установить соединение, 500 из удаленной службы и т. д.), тогда да, это подходит для исключения в Future для поднимитесь к обработчику ошибок и верните 500 вашему вызывающему абоненту (также при условии, что нет ресурсов, которые вам нужно очистить перед возвратом).

person kag0    schedule 04.01.2018
comment
Благодарность! да, это то, о чем я думал - поскольку в тот момент это не обязательно можно было восстановить. хотел бы я погрузиться в некоторые самоуверенные чтения на эту тему - person tgk; 04.01.2018

Вот пример, который поможет вам начать работу. Это метод, который вы обычно пишете в своем контроллере платформы Play.

def dispatchPowerPlant(id: Int) = Action.async(parse.tolerantJson) { request =>
    request.body.validate[DispatchCommand].fold(
      errors => {
        Future.successful{
          BadRequest(
            Json.obj("status" -> "error", "message" -> JsError.toJson(errors))
          )
        }
      },
      dispatchCommand => {
        actorFor(id) flatMap {
          case None =>
            Future.successful {
              NotFound(s"HTTP 404 :: PowerPlant with ID $id not found")
            }
          case Some(actorRef) =>
            sendCommand(actorRef, id, dispatchCommand)
        }
      }
    )
  }

Итак, что он делает, так это проверяет достоверность полезной нагрузки JSON и отправляет ответ соответствующим образом! Надеюсь это поможет!

Вероятно, у вас может быть аналогичная настройка для проверки JSON и соответствующего возврата ответа.

person joesan    schedule 03.01.2018