Scala WS异常错误(返回的网页代替Json)

Joh*_*ire 1 rest json web-services scala playframework

我正在使用Play scala WS向Web服务器发送REST api调用,有时会出现异常错误.Json被发送到服务器,服务器的响应可能是以下之一.

  1. 服务器返回有效的Json响应.
  2. 服务器返回"找不到有效的Json"
  3. 服务器返回一个错误网页,触发异常错误com.fasterxml.jackson.core.JsonParseException:意外字符('<'(代码60)):期望一个有效值(数字,字符串,数组,对象,'真', 'false'或'null')

如何修改以下代码以获取网页内容而不会出现异常错误?

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)
Run Code Online (Sandbox Code Playgroud)

mil*_*use 7

很大程度上取决于下游API服务器的"正确"程度.

在一个完美的世界里,我们可能会断言以下事实:

  1. 成功案例=> HTTP status200,HTTP Content-Type标头是application/json
  2. "找不到有效的Json"=> HTTP status404或类似的非200,HTTP Content-Type头是application/json
  3. "错误网页"=> HTTP status不是200,Content-Typetext/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
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

一些说明:

  • 异步执行就像使用await和更好地扩展一样简单
  • response.json返回与Json.parse身体上显式相同的东西
  • 我正在返回一个Option[JsValue]保存返回的JSON,如果它工作

如果上述假设成立,则可能需要对Content-Type标题进行更深入的检查,对status值和/或其他属性进行更细粒度的切换response.祝好运!