我有一个如下的代码示例,我使用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
}
}
实际上你不需要创建它。dataResponse是你正在寻找的类型。试着玩玩它,找到你需要的数据。你可以尝试调用。
dataResponse.body
或。
dataResponse.underlying
我有两种方法可以解决这个问题。
(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"