"Expected List as JsArray" 发布到 akka-http 服务器时
"Expected List as JsArray" when posting to an akka-http server
我正在尝试在此处创建 Orders/Items 应用程序的细微变化:
https://github.com/akka/akka-http/blob/master/docs/src/test/scala/docs/http/scaladsl/SprayJsonExampleSpec.scala#L51
我正在使用 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() )
}
}
服务器没问题。您的 HTTPie 调用有两个问题:
- JSON 数组需要 HTTPie
中的 :=
赋值运算符
- 您需要覆盖 Accept header 才能收到 200。否则,HTTPie 将假设
Accept:application/json
并且 Akka-HTTP 将返回 406 - Not Acceptable
错误.
http POST http://localhost:8080/post_an_order Accept:text/plain items:=[]
我正在尝试在此处创建 Orders/Items 应用程序的细微变化: https://github.com/akka/akka-http/blob/master/docs/src/test/scala/docs/http/scaladsl/SprayJsonExampleSpec.scala#L51
我正在使用 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() )
}
}
服务器没问题。您的 HTTPie 调用有两个问题:
- JSON 数组需要 HTTPie 中的
- 您需要覆盖 Accept header 才能收到 200。否则,HTTPie 将假设
Accept:application/json
并且 Akka-HTTP 将返回406 - Not Acceptable
错误.
:=
赋值运算符
http POST http://localhost:8080/post_an_order Accept:text/plain items:=[]