如何在不显式映射结果的情况下转发 WSResponse
How to forward a WSResponse without explicitly mapping the result
所以我有以下操作,我想找到一种直接 return 响应的方法,而不必将其映射到每个可能的状态代码的结果,即跳过 if-else 部分。
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)
}
}
你不应该等待结果。 Play 框架支持异步操作:
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
}
和隐式转换:
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))
}
}
参见github issue。
Mon Calamari 答案的变体,适用于 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))
}
}
这是基于 Barak BN 和 Mon Calamari 的答案的更新答案,适用于 Play 2.6:
import play.api.http.HttpEntity
import play.api.libs.ws.WSResponse
import scala.concurrent.Future
def response2Result(response: Future[WSResponse]): Future[Result] = {
response map {
response =>
val headers = response.headers
.map { h => (h._1, h._2.head) }
.filter { _._1.toLowerCase != "content-length" }
Result(
ResponseHeader(response.status, headers),
HttpEntity.Strict(response.bodyAsBytes, Some(response.contentType))
)
}
}
主要区别是在 2.6 中将 allHeaders
替换为 headers
并从结果中删除 "content-length" header 因为“显式 Content-Length
header 不允许 " by Akka.
所以我有以下操作,我想找到一种直接 return 响应的方法,而不必将其映射到每个可能的状态代码的结果,即跳过 if-else 部分。
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)
}
}
你不应该等待结果。 Play 框架支持异步操作:
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
}
和隐式转换:
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))
}
}
参见github issue。
Mon Calamari 答案的变体,适用于 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))
}
}
这是基于 Barak BN 和 Mon Calamari 的答案的更新答案,适用于 Play 2.6:
import play.api.http.HttpEntity
import play.api.libs.ws.WSResponse
import scala.concurrent.Future
def response2Result(response: Future[WSResponse]): Future[Result] = {
response map {
response =>
val headers = response.headers
.map { h => (h._1, h._2.head) }
.filter { _._1.toLowerCase != "content-length" }
Result(
ResponseHeader(response.status, headers),
HttpEntity.Strict(response.bodyAsBytes, Some(response.contentType))
)
}
}
主要区别是在 2.6 中将 allHeaders
替换为 headers
并从结果中删除 "content-length" header 因为“显式 Content-Length
header 不允许 " by Akka.