Почему Akka HTTP не соответствует моему телу JSON?

Я пытаюсь следовать примеру на https://doc.akka.io/docs/akka-http/current/common/json-support.html

Мой код выглядит так

final case class LeaderboardPostRequest(name: String, kind: String)
final case class LeaderboardPostResponse(name: Option[String], id: String)

trait JsonSupport extends SprayJsonSupport with DefaultJsonProtocol {
  implicit val requestFormat = jsonFormat2(LeaderboardPostRequest)
  implicit val responseFormat = jsonFormat2(LeaderboardPostResponse)
}

class LeaderboardEndpoint extends Directives with JsonSupport {
. . .
  def leaderboardPost(name: Option[String]): Route =
    post {
      logRequest("leaderboard", Logging.InfoLevel) {
        entity(as[LeaderboardPostRequest]) { leaderboard =>
          try {
            complete(leaderboardCreate(Some(leaderboard.name), Some(leaderboard.kind)))
          } catch {
            case cause: LeaderboardException => complete(cause.getHttpResponse)
            case cause: Throwable =>
            complete(HttpResponse(InternalServerError, entity = s"Exception thrown from LeaderboardPost: ${cause.getMessage}"))
          }
        } ~
        complete(HttpResponse(BadRequest, entity = "****body missing****"))
    }
  }
. . .
}

Лог выглядит так

HttpRequest(HttpMethod(POST),http://localhost:8080/leaderboard?name=foo,List(User-Agent: Mozilla/5.0 (Windows NT; Windows NT 10.0; en-CA) WindowsPowerShell/5.1.17763.134, Host: localhost:8080, Timeout-Access: <function1>),HttpEntity.Strict(application/json,{name="foo",kind="ConcurrentLeaderboard"}),HttpProtocol(HTTP/1.1))

но результат всегда

 ****body missing****

Я подозреваю, что это что-то простое, но я заблокирован и не могу понять, какая дополнительная магия требуется. Помощь/предложения/подсказки будут оценены.


person Eric Kolotyluk    schedule 21.01.2019    source источник


Ответы (1)


я думаю, что может быть несколько (возможно, пересекающихся) проблем:

  1. из того, что я вижу в сообщении журнала, это то, что path маршрута не настроен, пожалуйста, обратитесь к документы директив пути.

  2. возможно, вы неправильно использовали logRequest методы. значение параметра "leaderbord" — это просто некий маркер для журнала, по крайней мере, это то, что документы директивы logRequest говорят

  3. я не уверен, что сама полезная нагрузка верна: {name="foo",kind="ConcurrentLeaderboard"}. имена ключей также должны быть в кавычках (но, возможно, это так же, как в журнале, без кавычек). и поскольку akka-http не может сопоставить полезную нагрузку с классом case LeaderboardPostRequest, берется следующий вариант маршрута в соответствии с составить директивные документы, что является вариантом с BadRequest

person Serhii Shynkarenko    schedule 21.01.2019
comment
№3 проблема. Я должен использовать {"name":"foo","kind":"ConcurrentLeaderboard"} -- большое спасибо -- теперь нужно посмотреть, есть ли способ добавить диагностику к анализу JSON. - person Eric Kolotyluk; 22.01.2019
comment
Учимся использовать отказы. Странно, как поведение по умолчанию для этого — ничего не делать/не говорить, что приводит к загадочным сбоям. - person Eric Kolotyluk; 22.01.2019