scala 如何将akka http请求实体解组为字符串数组?

dnph8jn4  于 2022-12-29  发布在  Scala
关注(0)|答案(1)|浏览(113)

我尝试将post请求有效负载解组为字符串数组,但失败,出现400个错误请求,错误如下:
请求内容格式不正确:应为JsString形式的字符串,但得到的是{"应用程序":{"应用程序修订版本":{"字符串":" 27904 "},"应用程序版本":"印度","ID":"132231","名称":"应用程序测试"},"访客":{"会话":"12bvg","系统时间":"2021年8月24日T21:19:13.282Z","访问者ID":"abc "}}
发布请求的正文:

[{"application":{"applicationRevision":{"string":"27904"},"applicationVersion":"india","id":"132231","name":"appTest"},"guest":{"session":"12bvg","systemTime":"2021-08-24T21:19:13.282Z","visitorId":"abc"}}]

下面是代码:

def genericEventRoute: Route =
    path(basePath / version / "event" / "generic") {
      concat(
        post {
          entity(as[Array[String]]) { inputs =>
            extractClientIP { ip =>
              val ipAddress = ip.toOption.map(_.getHostAddress).getOrElse("unknown")
              system.log.info(s"ipAddress : $ipAddress")
              val operationPerformed: Future[IncomingIngest.Response] = incomingIngest.ask(IncomingIngest.ConsumeGenericEvent(inputs, ipAddress, _))
              onSuccess(operationPerformed) {
                case IncomingIngest.OK(message) => complete(StatusCodes.Created, List(`Content-Type`(`application/json`)), message)
                case IncomingIngest.KO(error) => complete(StatusCodes.BadRequest, error)
              }
            }
          }
        }
      )
    }

我怎么能解组成字符串数组!!如果我在请求中发送一个字符串,省略***[]***并使用**实体,这是有效的(as [String])在路由中。但是,我应该获得的有效负载将是字符串数组。有一种方法可以使用case类来解开有效负载,但为了做到这一点,json里面的所有字段都必须被Map,这是我不想要的。路由应该用字符串数组来处理通用负载。你能建议一种方法吗?

dced5bon

dced5bon1#

传入的输入是一个JsArray,所以必须将其转换为scala向量/字符串列表,然后进行相应的处理。

def genericEventRoute: Route =
    path(basePath / version / "event" / "generic") {
      concat(
        post {
          entity(as[JsArray]) { inputs =>
            extractClientIP { ip =>
              val ipAddress = ip.toOption.map(_.getHostAddress).getOrElse("unknown")
              system.log.info(s"ipAddress : $ipAddress")
              val arrInput = inputs.elements.map(ele => ele.toString())
              val operationPerformed: Future[IncomingIngest.Response] = incomingIngest.ask(IncomingIngest.ConsumeGenericEvent(arrInput, ipAddress, _))
              onSuccess(operationPerformed) {
                case IncomingIngest.OK(message) => complete(StatusCodes.Created, List(`Content-Type`(`application/json`)), message)
                case IncomingIngest.KO(error) => complete(StatusCodes.BadRequest, error)
              }
            }
          }
        }
      )
    }

请记住,***arrInput***的类型为***Vector[String]***。尽管最好的方法是创建一个case类,并将json直接解析为Tim在注解中提到的类型。但是,对于那些传入消息不遵循任何特定格式的用例,这可能会导致解析错误。这样,我们可以接受任何传入消息并将其推送到可以验证有效载荷的下游。

相关问题