2017-02-08 10 views
0

Я пытаюсь создать небольшое изменение приложения Orders/Items здесь: 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. вам необходимо переопределить Accept заголовка, чтобы получить 200. В противном случае, HTTPie предположит Accept:application/json и Акку-HTTP будет возвращайтесь с ошибкой 406 - Not Acceptable.

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