0

我有一个代码示例,如下所示,我使用 WSClient 进行 API 调用。我正在使用 2.5.x 和 Scala 2.11.11(使用 Play 提供的 WSClient 不是独立的)。在异常情况下,我需要将 WSResponse 对象返回给此方法的调用者。从文档中我找到了提供 AhcWSResponse 的 Ahc 包。知道如何创建 WSResponse 对象吗?我根据下面的链接进行了尝试,但这不起作用。

如何从字符串为 Play WSClient 创建一个 WSResponse 对象

def fetchData (request: WSRequest): Future[WSResponse] = {  
   request.withQueryString("apitoken" -> token).get().flatMap { dataResponse =>
         if (dataResponse.status == 200) {
            Future(Ok(dataResponse.json))
         } else if (dataResponse.status == 400) {
         ...
         }
  }.recover {
     case e: Exception =>
        //need  to return a WSResponse object - how do i create one here 
  }
}
4

2 回答 2

0

有两种方法可以解决这个问题:

(1) 通过创建一个虚拟 WSResponse 实例,如下所示:

class DummyWSResponse extends WSResponse {
      def status: Int = 500
      def allHeaders: Map[String, Seq[String]] = ???
      def body: String = ???
      def bodyAsBytes: akka.util.ByteString = ???
      def cookie(name: String): Option[play.api.libs.ws.WSCookie] = ???
      def cookies: Seq[play.api.libs.ws.WSCookie] = ???
      def header(key: String): Option[String] = ???
      def json: play.api.libs.json.JsValue = ???
      def statusText: String = ???
      def underlying[T]: T = ???
      def xml: scala.xml.Elem = ???
   }

(2) [首选] 使用 mockito-scala:

import org.mockito.MockitoSugar._
...
{...}.recover {
   case e: Exception =>
      val mockResponse = mock[WSResponse]
      when(mockResponse.status) thenReturn 500
      mockResponse
}

我在 build.sbt 中使用了以下内容来添加 Mockito 依赖项:

libraryDependencies += "org.mockito" % "mockito-scala_2.11" % "1.14.4"
于 2020-06-18T01:24:35.703 回答
0

实际上你不需要创建它。你拥有了它。dataResponse 是您正在寻找的类型。尝试使用它并找到您需要的数据。您可以尝试调用:

dataResponse.body

或者:

dataResponse.underlying
于 2020-06-15T13:05:28.203 回答