Scala POST请求有时会在Akka http程序中命中错误的端点

Scala POST请求有时会在Akka http程序中命中错误的端点,scala,alamofire,spray,akka-http,Scala,Alamofire,Spray,Akka Http,我有一个AKKAHTTP2服务器来处理http请求 在任一端点上,我将转换为案例类别A或B: case class caseClassA(data: String, eventID: String) case class caseClassB(data: String, otherData: JsObject) 我有这样一个routes对象: val routes = { logRequestResult("akka-http-microservice") {

我有一个AKKAHTTP2服务器来处理http请求

在任一端点上,我将转换为案例类别A或B:

case class caseClassA(data: String, eventID: String)
case class caseClassB(data: String, otherData: JsObject)
我有这样一个routes对象:

   val routes = {
     logRequestResult("akka-http-microservice") {        
       pathPrefix("some_endpoint")
        (post & entity(as[caseClassA])) {
        Request =>
          val future = someFunction(Request)
            complete {
              future.map(result =>
                result
              )
            }
        } ~
        pathPrefix("other_endpoint") {
          (post & entity(as[caseClassB])) {
          Request =>
            val future = otherFunction(Request)
              complete {
                future.map(result =>
                  result
                ) 
              }
            }
          }
        }
问题有时,当使用Alamofire从iOS应用程序调用时,我在使用caseClassB可转换JSON对象请求
其他\U端点
时,会收到错误响应,错误数据发送到
某些\U端点

[DEBUG] [01/22/2016 16:30:16.350] [ReactiveKafka-akka.actor.default-dispatcher-23] [ActorSystem(ReactiveKafka)] akka-http-microservice: Response for
  Request : HttpRequest(HttpMethod(POST),http://192.168.2.141:9004/other_endpoint,List(Host: 192.168.2.141:9004, Connection: keep-alive, Accept: */*, User-Agent: myapp/myco.myapp (1; OS Version 9.2  (Build 13C75)), Accept-Language: en-US, zh-Hans-US;q=0.9, Accept-Encoding: gzip, compress;q=0.5),HttpEntity.Strict(application/json,ByteString(XXX, XXX, XXX, XXX, ETC <REPLACED FOR READABILITY, THIS WAS GOOD DATA>)),HttpProtocol(HTTP/1.1))
  Response: Complete(HttpResponse(200 OK,List(),HttpEntity.Strict(application/json,ByteString(XXX, XXX, XXX, XXX, ETC <REPLACED FOR READABILITY, THIS WAS GOOD DATA>)),HttpProtocol(HTTP/1.1)))
[DEBUG] [01/22/2016 16:30:21.347] [ReactiveKafka-akka.actor.default-dispatcher-5] [akka://ReactiveKafka/user/$a/flow-17-2-prefixAndTail] Cancelling akka.stream.impl.MultiStreamOutputProcessor$SubstreamOutput@454147bb (after: 5000 ms)
[DEBUG] [01/22/2016 16:30:26.259] [ReactiveKafka-akka.actor.default-dispatcher-7] [ActorSystem(ReactiveKafka)] akka-http-microservice: Response for
  Request : HttpRequest(HttpMethod(POST),http://192.168.2.141:9004/other_endpoint,List(Host: 192.168.2.141:9004, Connection: keep-alive, Accept: */*, User-Agent: myapp/myco.myapp (1; OS Version 9.2  (Build 13C75)), Accept-Language: en-US, zh-Hans-US;q=0.9, Accept-Encoding: gzip, compress;q=0.5),HttpEntity.Default(application/json,319,akka.stream.scaladsl.Source@c3e53bd),HttpProtocol(HTTP/1.1))
  Response: Rejected(List(MalformedRequestContentRejection(Object is missing required member 'eventID',Some(java.util.NoSuchElementException: key not found: eventID)), TransformationRejection(<function1>), MalformedRequestContentRejection(Unexpected end-of-input at input index 0 (line 1, position 1), expected JSON Value:

^
,None), TransformationRejection(<function1>)))
[DEBUG][01/22/2016 16:30:16.350][ReactiveKafka-akka.actor.default-dispatcher-23][actor系统(ReactiveKafka)]akka http微服务:对
  请求:HttpRequest(HttpMethod(POST),http://192.168.2.141:9004/other_endpoint,列表(主机:192.168.2.141:9004,连接:保持活动,接受:*/*,用户代理:myapp/myco.myapp(1;操作系统版本9.2  (Build 13C75)),接受语言:en-US,zh-Hans-US;q=0.9,接受编码:gzip,compress;q=0.5),HttpEntity.Strict(application/json,ByteString(XXX,XXX,XXX,XXX等)),HttpProtocol(HTTP/1.1))
  响应:完成(HttpResponse(200ok,List(),HttpEntity.Strict(application/json,ByteString(XXX,XXX,XXX,XXX等)),HttpProtocol(HTTP/1.1)))
[DEBUG][01/22/2016 16:30:21.347][ReactiveKafka-akka.actor.default-dispatcher-5][akka://ReactiveKafka/user/$a/flow-17-2-prefixAndTail]取消akka.stream.impl.multistreamoutprocessor$SubstreamOutput@454147bb(之后:5000毫秒)
[DEBUG][01/22/2016 16:30:26.259][ReactiveKafka-akka.actor.default-dispatcher-7][actor系统(ReactiveKafka)]akka http微服务:响应
  请求:HttpRequest(HttpMethod(POST),http://192.168.2.141:9004/other_endpoint,列表(主机:192.168.2.141:9004,连接:保持活动,接受:*/*,用户代理:myapp/myco.myapp(1;操作系统版本9.2  (构建13C75)),接受语言:en-US,zh-Hans-US;q=0.9,接受编码:gzip,compress;q=0.5),HttpEntity.Default(application/json,319,akka.stream.scaladsl。Source@c3e53bd),httprotocol(HTTP/1.1))
  响应:Rejected(列表(MalformedRequestContentRejection(对象缺少必需的成员'eventID',部分(java.util.NoSuchElementException:key not found:eventID)),TransformationRejection(),MalformedRequestContentRejection(输入索引0(第1行,位置1)处的输入意外结束),预期JSON值:
^
,无),转换拒绝())
正如您通过缺少
eventID
所看到的,这正试图转换为caseClassA。上面输出中的两个请求都表明我正在尝试命中其他的\u端点。当我使用相同的数据从Postman调用此端点时,它在100%的时间内工作


给出了什么?

从上面的评论中可以看出,问题是
“某些端点”
的代码周围缺少大括号(
{}
)。以下是更正后的代码块:

val routes = {
  logRequestResult("akka-http-microservice") {        
    pathPrefix("some_endpoint") {
      (post & entity(as[caseClassA])) {
         Request =>
         val future = someFunction(Request)
         complete {
           future.map(result =>
             result
           )
         }
       }
     } ~
     pathPrefix("other_endpoint") {
       (post & entity(as[caseClassB])) {
         Request =>
         val future = otherFunction(Request)
         complete {
           future.map(result =>
             result
           ) 
         }
       }
     }
   }

这会像pathPrefix(“some_endpoint”)指令后缺少一组大括号一样简单吗?是的。经过多次测试,这似乎是导致间歇性故障的原因。奇怪的是,sbt/IntelliJ没有出现语法错误的问题。该死的花括号。