需要帮助创建一个虚拟的WSResponse对象(Scala + Play)。

问题描述 投票:0回答:1

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

如何从字符串中创建一个WSResponse对象,用于播放WSClient。

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 
  }
}
scala playframework ws-client
1个回答
0
投票

实际上你不需要创建它。dataResponse是你正在寻找的类型。试着玩玩它,找到你需要的数据。你可以尝试调用。

dataResponse.body

或。

dataResponse.underlying

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"
© www.soinside.com 2019 - 2024. All rights reserved.