2017-02-08 73 views
0

當我試圖創建這裏的訂單/項目申請的一個微小的變化: https://github.com/akka/akka-http/blob/master/docs/src/test/scala/docs/http/scaladsl/SprayJsonExampleSpec.scala#L51「預期列表爲JsArray」張貼到阿卡http服務器

我使用連接到服務器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. 你需要重寫接受頭接收了200元。否則,HTTPie將承擔Accept:application/json和阿卡-HTTP會回來時出現406 - Not Acceptable錯誤。

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