Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to forward a WSResponse without explicitly mapping the result

So I have the following action and I would like to find a way to directly return the response without having to map it to a result for every possible status code i.e skip the if-else part.

def testAction = Action { implicit requestIn => {

   val requestOut : WSRequest = WS.url("test-domain-name:9998")

   val queryString = requestIn.queryString.map { case (k,v) => k -> v.mkString }

   val futureResponse : Future[WSResponse] = requestOut.withQueryString(queryString.toList: _*).get()

   val response = Await.result(requestOut.withQueryString(queryString.toList: _*).get(), 5 seconds)

   if(response.status == 200) {
      Ok(response.xml)
   } else {
      BadRequest(response.body)
   }

}
like image 838
Todor Kolev Avatar asked Nov 08 '25 02:11

Todor Kolev


2 Answers

You should not await for result. Play framework supports async actions:

def testAction = Action.async { implicit requestIn =>

    val requestOut: WSRequest = WS.url("test-domain-name:9998")

    val queryString = requestIn.queryString.map { case (k, v) => k -> v.mkString }

    val futureResponse: Future[WSResponse] = requestOut.withQueryString(queryString.toList: _*).get()

    futureResponse

}

And implicit conversion:

implicit def Response2Result(response: Future[WSResponse]): Future[Result] = {
  response map {
    response =>
      val headers = response.allHeaders map {
        h => (h._1, h._2.head)
      }
      Result(ResponseHeader(response.status, headers), Enumerator(response.body.getBytes))
  }
}

See github issue.

like image 197
Mon Calamari Avatar answered Nov 09 '25 23:11

Mon Calamari


Variation on Mon Calamari's answer, for Play 2.5

implicit def Response2Result(response: Future[WSResponse]): Future[Result] = {
  response map {
    response =>
      val headers = response.allHeaders map {
        h => (h._1, h._2.head)
      }
      Result(ResponseHeader(response.status, headers), Strict(response.bodyAsBytes, None))
  }
}
like image 45
Barak BN Avatar answered Nov 10 '25 00:11

Barak BN



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!