Apache pekko ( akka http ) - 从请求中提取的字符串正文没有引号

Apache pekko ( akka http ) - Extracted string body from request doesn't have quote

提问人:user670097 提问时间:11/16/2023 更新时间:11/16/2023 访问量:19

问:

我正在为我的下一个项目制作 pekko http ( akka http )。 我从请求正文实体中提取了 json 字符串,但它在字符串值上没有引号。

路由 dsl 上的代码片段:

  post {
    path("account") {
      extract(_.request) { request =>
        val body = Await.result(request.entity.toStrict(1.second).map(_.data.utf8String), 1.second)
        println(body)
        complete(...)
      }
    }
  }

请求:curl -X POST http://localhost:9090/account -d '{“account”:{“name”:“TESTE”}}'
提取的 json 字符串:{account:{name:TESTE}}

有人知道如何在不删除引号的情况下提取请求正文实体吗?

json 请求 akka-http

评论


答:

1赞 earthling paul 12/7/2023 #1

没有什么能阻止你这样做,但是在使用 akka-http 时,使用 Await 进行阻塞并不是一个好的做法。这还会提取原始 JSON 字符串,而不删除引号:

  val jsonRaw: Route =
  path("jsonRaw")(
    post(
      entity(as[String]) {
        json =>
          println("JSON raw: " + json)
          complete(StatusCodes.OK)
      }
    )
  )

工作示例:https://github.com/pbernet/akka_streams_tutorial/blob/70e52e6e769a2779f1a6de744aab3cf4f16a3835/src/main/scala/akkahttp/SampleRoutes.scala#L121

要检查服务器上的请求,您可以在 application.conf 中设置这些参数以检测环境问题。

pekko {
  loglevel = "DEBUG"
  http.server.log-unencrypted-network-bytes = 100
  ...
  }

评论

0赞 user670097 12/19/2023
感谢您@earthling保罗的回答,我检查了您的项目并确认其有效。但是当我在我的项目中测试时,它仍然显示出相同的prroblem。所以我尝试了只有路由代码的新项目,但仍然删除了引号。github.com/headiron/library_route_test请求:curl 127.0.0.1:6002/jsonRaw -X POST -d '{“TEST”:“TEST”}}' 控制台输出:JSON raw: '{TEST:TEST}}' 您认为需要添加任何选项吗?我找不到任何相关的配置选项并尝试删除/添加一些库,但它对解决问题没有帮助。
0赞 earthling paul 12/19/2023
嗯,我正在 Windows 和 Mac 上使用 Java 11/21 运行您的代码并获得预期的结果。因此,这可能是您的环境有所不同,例如编码。我已经更新了我的答案,其中包含在服务器上进行检查的方法。
0赞 user670097 12/20/2023
感谢@earthling保罗的检查。你是对的。我已经在 Window 上使用 IDEA 进行了测试,这个问题正在发生。在您的评论之后,我在 Linux 上使用 sbt 对其进行了测试,它可以正常工作。正如你所说,一些环境可能会影响问题,并且似乎更多地挖掘了问题。对不起,还有一个问题。是否有任何简单的 API(不是像 entity(as[String]) 这样的指令)来从请求对象中提取 json 字符串?Await.result(request.entity.toStrict(1.second).map(_.data.utf8String), 1.second) 仅提取 json 字符串就很复杂,我们不能使用 entity(as[String])
0赞 earthling paul 12/20/2023
使用 akka-http 时,使用 Await 进行阻塞不是一个好的做法,但没有什么能阻止您这样做。如果您喜欢上面的答案,您可以批准它
0赞 earthling paul 12/21/2023
添加了要回答的评论要点