Scala POST请求有时会在Akka http程序中命中错误的端点
我有一个AKKAHTTP2服务器来处理http请求 在任一端点上,我将转换为案例类别A或B: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") {
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没有出现语法错误的问题。该死的花括号。