Потребление и API с помощью Scala Dispatch Один и тот же метод, два разных JSON

Я использую REST API. Когда вызов проходит нормально, этот API возвращает заголовок 200 OK. Затем в теле он может обрабатывать два разных JSON.

{"Error": {
   "code" = 1
   "msg" = "some error message"
  }
}

Или, если отправленные данные были правильными, возвращается

{"code" : {
  "status" = "Your submission is ..."
  "msg" = "It is happy"
  "answer" = {...}
}

Проблема в том, что, если я использую json4s, я должен знать, какой класс case использовать, что мне делать, использовать Either[Error,Code], после преобразования JValue в String и проверить, содержит ли он Error, затем Left (Error) или еще Right (Code), какое решение я должен принять. Я ищу хорошее решение и, возможно, правильное объяснение этому.

Проблема моего aprrocach заключается в том, что Dispatch дает мне Either[String, JsValue], поэтому, наконец, я получу Either [String, Either [Error, Code]], и это кажется не очень хорошим объектом


person anquegi    schedule 02.07.2015    source источник
comment
Извините, я не понимаю, получаете ли вы по-прежнему 200 в ответе http для случая ошибки.   -  person rock-fall    schedule 02.07.2015
comment
Да, когда вызов проходит нормально и возвращает 200 ОК. Он может возвращать два разных json-файла: ошибку и код, в зависимости от отправляемых вами данных и после их обработки на сервере.   -  person anquegi    schedule 03.07.2015


Ответы (1)


Я бы порекомендовал вам использовать промежуточный JValue (JObject) для проверки вашего состояния ошибки, а не String, и упростить ваши типы с помощью Try и запечатанного трейта.

  1. Используйте future onComplete, чтобы перейти к типу Try, возвращаемому из отправки.
  2. Используйте JObject из JValue, чтобы проверить поле ошибки.
  3. Добавьте новый запечатанный трейт, например ApiFooResponse, и расширьте его в обоих классах case.
  4. Условно верните преобразование вашего конкретного класса case, сопоставленное с Try.

Это позволит избежать преобразования String и упростит тип до Try [ApiFooResponse]. Пожалуйста, поправьте меня, если я сделал какие-то ложные предположения.

person rock-fall    schedule 06.07.2015