【问题标题】:Scala WS exception error (Web page returned instead of Json)Scala WS异常错误(返回网页而不是Json)
【发布时间】:2014-04-28 06:04:02
【问题描述】:
我正在使用 Play scala WS 向 Web 服务器发送 REST api 调用,有时会出现异常错误。 Json 被发送到服务器,服务器的响应可能是以下之一。
- 服务器返回一个有效的 Json 响应。
- 服务器返回“未找到有效的 Json”
- 服务器返回一个触发异常的错误网页错误 com.fasterxml.jackson.core.JsonParseException: Unexpected character ('
如何修改下面的代码获取网页内容而不出现异常错误?
import play.api.libs.ws._
var tempText = Helpers.await(WS.url("localhost:9000/someApi").post(jsonToSend)).body
println(tempText)
tempJson = Json.parse(tempText)
println(tempJson)
【问题讨论】:
标签:
json
web-services
scala
rest
playframework
【解决方案1】:
很大程度上取决于下游 API 服务器的“正确性”程度。
在一个完美的世界里,我们大概可以断言以下事实:
- 成功案例 => HTTP
status 是 200,HTTP Content-Type 标头是 application/json
- "未找到有效的 Json" => HTTP
status 是 404 或类似的非 200,HTTP Content-Type 标头是 application/json
- “错误网页” => HTTP
status 不是 200,Content-Type 是 text/html
如果上述断言都是正确的,那么我们可以简单地在我们的响应处理中添加一点“保护”,而不是仅仅跳入并尝试将其解析为 JSON:
val futureOptionalResult = WS.url("localhost").post("...").map { response =>
response.status match {
case 200 => {
println(response.body)
println(response.json)
Some(response.json)
}
case _ => {
println(s"Not OK: ${response.status} - body is: ${response.body}")
None
}
}
}
一些注意事项:
- 异步执行与使用
await 一样简单,并且可以更好地扩展
-
response.json 返回的内容与正文上的显式 Json.parse 相同
- 我将返回一个
Option[JsValue],它会保存返回的 JSON(如果它有效)
如果上述假设不正确,则可能会更深入地检查Content-Type 标头、更细粒度地切换status 值和/或response 的其他属性需要。祝你好运!