"Ожидаемый список как JsArray" при публикации на сервере akka-http

Я пытаюсь создать небольшой вариант приложения Orders/Items здесь: https://github.com/akka/akka-http/blob/master/docs/src/test/scala/docs/http/scaladsl/SprayJsonExampleSpec.scala

Я подключаюсь к серверу с помощью httpie, команда:

http POST http://localhost:8080/post_an_order items=[]

Я получаю следующую ошибку:

HTTP/1.1 400 Bad Request
Content-Length: 73
Content-Type: text/plain; charset=UTF-8
Date: Wed, 08 Feb 2017 19:04:37 GMT
Server: akka-http/10.0.3

The request content was malformed:
Expected List as JsArray, but got "[]"

Код является:

import akka.actor.ActorSystem
import akka.stream.ActorMaterializer
import akka.http.scaladsl.Http
import akka.http.scaladsl.server.Directives._
import akka.http.scaladsl.marshallers.sprayjson.SprayJsonSupport._
import spray.json.DefaultJsonProtocol._
import scala.io.StdIn

case class Item(id: Long, name: String)
case class Order(items: List[Item])

object WebServer {
  implicit val system = ActorSystem()
  implicit val materializer = ActorMaterializer()
  implicit val executionContext = system.dispatcher

  implicit val itemFormat = jsonFormat2(Item)
  implicit val orderFormat = jsonFormat1(Order)

  def main(args: Array[String]) {
    val route =
      get {
        pathSingleSlash {
          complete( Item(123, "DefaultItem") )
        }
      } ~
      post {
        path("post_an_order") {
          entity(as[Order]) { order =>
            val itemsCount = order.items.size
            val itemNames = order.items.map(_.name).mkString(", ")
            complete(s"Ordered $itemsCount items: $itemNames")
          }
        }
      }

    val bindingFuture = Http().bindAndHandle(route, "localhost", 8080)

    println("http://localhost:8080/")

    StdIn.readLine()
    bindingFuture.flatMap( _.unbind() ).onComplete( _ => system.terminate() )
  }
}

1 ответ

Решение

Сервер в порядке. Две проблемы с вашим вызовом HTTPie:

  1. JSON-массивы требуют := оператор присваивания в HTTPie
  2. вам нужно переопределить заголовок Accept, чтобы получить 200. В противном случае HTTPie примет Accept:application/json и Akka-HTTP вернется с 406 - Not Acceptable ошибка.

http POST http://localhost:8080/post_an_order Accept:text/plain items:=[]

Другие вопросы по тегам