Apache Pekko HTTP提取请求体字符串丢失引号问题求助
解决Apache Pekko HTTP提取请求体丢失引号的问题
问题根源
你遇到的引号丢失问题,核心原因是curl请求未正确传递带引号的JSON内容,而非Pekko HTTP的提取逻辑错误。默认情况下,curl的-d参数会将数据以application/x-www-form-urlencoded格式发送,可能导致JSON结构被意外解析;同时若shell环境对引号处理不当,也会导致原始JSON的引号被丢弃。
解决方案
1. 修正curl请求命令
必须指定Content-Type: application/json头,确保请求体被当作JSON格式传递,同时正确包裹JSON内容:
- Linux/macOS(bash/zsh环境):
curl -X POST http://localhost:9090/account -H "Content-Type: application/json" -d '{"account":{"name":"TESTE"}}'
- Windows CMD环境:
curl -X POST http://localhost:9090/account -H "Content-Type: application/json" -d "{\"account\":{\"name\":\"TESTE\"}}"
2. 优化Pekko HTTP路由代码
原始代码使用Await会导致阻塞,不符合Pekko的非阻塞设计原则,建议改用异步方式提取请求体:
方式一:使用extractRequest异步处理
post { path("account") { extractRequest { request => request.entity.toStrict(1.second).map { strictEntity => val body = strictEntity.data.utf8String println(body) complete(StatusCodes.OK) } } } }
方式二:直接用entity(as[String])提取(更简洁)
post { path("account") { entity(as[String]) { body => println(body) complete(StatusCodes.OK) } } }
验证逻辑
只要curl发送的请求体包含完整带引号的JSON,上述两种代码方式都能提取到保留引号的原始字符串。你可以通过打印请求头的方式验证:比如在路由中添加extract(_.request.headers),确认Content-Type是否为application/json。
内容的提问来源于stack exchange,提问作者user670097
相关产品推荐
相关产品推荐

