【问题标题】: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 被发送到服务器,服务器的响应可能是以下之一。

  1. 服务器返回一个有效的 Json 响应。
  2. 服务器返回“未找到有效的 Json”
  3. 服务器返回一个触发异常的错误网页错误 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 服务器的“正确性”程度。

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

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

    一些注意事项:

    • 异步执行与使用 await 一样简单,并且可以更好地扩展
    • response.json 返回的内容与正文上的显式 Json.parse 相同
    • 我将返回一个 Option[JsValue],它会保存返回的 JSON(如果它有效)

    如果上述假设正确,则可能会更深入地检查Content-Type 标头、更细粒度地切换status 值和/或response 的其他属性需要。祝你好运!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-18
      • 1970-01-01
      • 2018-07-27
      • 1970-01-01
      • 2012-09-24
      • 2021-09-01
      • 1970-01-01
      • 2023-03-12
      相关资源
      最近更新 更多