Почему Akka HTTP не соответствует моему телу JSON? - PullRequest
0 голосов
/ 22 января 2019

Я пытаюсь следовать примеру на 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****

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

1 Ответ

0 голосов
/ 22 января 2019

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

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

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

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

...