- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 Play 的 WSClient 与第三方服务进行交互
request = ws.url(baseUrl)
.post(data)
.map{ response =>
response.json.validate[MyResponseClass]
MyResponseClass
或者它可能是
ErrorResponse
喜欢
{ "error": [ { "message": "Error message" } ] }
response.json.validateOpt[MyResponseClass].getOrElse(response.json.validateOpt[ErrorClass])
最佳答案
这个问题没有唯一的答案。这里有多个微妙的考虑。我的回答将尝试提供一些方向。
至少要处理四种不同的情况 :
Future
里面的响应是 ErrorResponse
或 MyResponseClass
,即 Either[ErrorResponse, MyResponseClass]
:MyResponseClass
ErrorResponse
Future
除了里面:Future(Left(errorResponse))
对比 Future(throw new Exception)
Future(Left(errorResponse))
之间的区别和
Future(throw new Exception)
:我们只将后者视为
failed future .前者,尽管有
Left
里面还是考虑一个顺利完成的 future 。
Future.andThen
对比 Future.recover
Future.andThen
之间的区别和
Future.recover
: 前者不会改变future里面的值,而后者可以改变里面的值和它的类型。如果无法恢复,我们至少可以使用
andThen
记录异常。 .
import akka.actor.ActorSystem
import akka.stream.ActorMaterializer
import play.api.libs.ws._
import play.api.libs.ws.ahc._
import scala.concurrent.ExecutionContext.Implicits._
import scala.concurrent.Future
import play.api.libs.json._
import play.api.libs.ws.JsonBodyReadables._
import scala.util.Failure
import java.io.IOException
import com.fasterxml.jackson.core.JsonParseException
case class ErrorMessage(message: String)
object ErrorMessage {
implicit val errorMessageFormat = Json.format[ErrorMessage]
}
case class ErrorResponse(error: List[ErrorMessage])
object ErrorResponse {
implicit val errorResponseFormat = Json.format[ErrorResponse]
}
case class MyResponseClass(a: String, b: String)
object MyResponseClass {
implicit val myResponseClassFormat = Json.format[MyResponseClass]
}
object PlayWsErrorHandling extends App {
implicit val system = ActorSystem()
implicit val materializer = ActorMaterializer()
val wsClient = StandaloneAhcWSClient()
httpRequest(wsClient) map {
case Left(errorResponse) =>
println(s"handle application level error: $errorResponse")
// ...
case Right(goodResponse) =>
println(s"handle application level good response $goodResponse")
// ...
} recover { // handle failed futures (futures with exceptions inside)
case parsingError: JsonParseException =>
println(s"Attempt recovery from parsingError")
// ...
case networkingError: IOException =>
println(s"Attempt recovery from networkingError")
// ...
}
def httpRequest(wsClient: StandaloneWSClient): Future[Either[ErrorResponse, MyResponseClass]] =
wsClient.url("http://www.example.com").get() map { response ⇒
if (response.status >= 400) // application level error
Left(response.body[JsValue].as[ErrorResponse])
else // application level good response
Right(response.body[JsValue].as[MyResponseClass])
} andThen { // exceptions thrown inside Future
case Failure(exception) => exception match {
case parsingError: JsonParseException => println(s"Log parsing error: $parsingError")
case networkingError: IOException => println(s"Log networking errors: $networkingError")
}
}
}
libraryDependencies ++= Seq(
"com.typesafe.play" %% "play-ahc-ws-standalone" % "1.1.3",
"com.typesafe.play" %% "play-ws-standalone-json" % "1.1.3"
)
关于scala - 使用 Play WSClient 处理 JSON 错误响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47210587/
我在soap中的cxf + WSClient有一些问题。 我正在用grails编写一个小工具,该工具必须对现有服务进行SOAP调用。 WSClient(groovyws-0.5.3-20100521.
在一个大型 Play 2.5 应用程序的一个部分,我需要为供应商的网站制作一个 TLS。供应商给了我一个证书(P7B 证书,如果重要的话),我将使用它。 如果我使用 curl 会很简单:curl --
在 Play 2.4.3 网络应用程序中,我需要使用 WSClient 通过 HTTPS 调用其他服务。我关注了the article但出现错误: play.api.libs.ws.ssl.Compo
我正在尝试通过自定义 ssl 配置在我的 Play 应用程序中使用 WSClient,但它不起作用。 我的 Controller 如下所示: @Singleton class HomeControll
我有一个 WS avaialbel @ http://domain.com/Service?wsdl 。 wsdl 导入多个 XSD 定义。当我尝试调用如下所示的服务时,我收到一个异常,说它无法在服务
我正在尝试使用以下方法将一个类 DI 到单元测试中: val injector = new GuiceInjectorBuilder().injector() val secured = inject
我在 playframework 中遇到 WSClient 问题。 当我在finally block 中发送关闭WSClient的请求时: public WSResponse sendPostReq
我试图用 groovy WSClient 连接到 Exchange 服务器 wsdl,但不能,因为我收到一个空文件(当我想解析 wsdl 时)。我正在使用以下几行: Map mapClient=[
我正在使用 Play 的 WSClient 与第三方服务进行交互 request = ws.url(baseUrl) .post(data) .map{ response => re
我当前正在尝试使用 WSClient 使用以下代码将文件发布到端点 public Result uploadBankingFile(){ logger.info("Uploading file
Documentation建议使用模拟网络服务测试基于 WSClient 的 API 客户端,即创建一个 play.server.Server 来响应真实的 HTTP 请求。 我更愿意直接从文件创建
在编写 JAXWS 客户端时,这是我过去使用的: // CALL SERVICE EPaymentsService bPayService = new EPaymentsService(); Serv
在编写 JAXWS 客户端时,这是我过去使用的: // CALL SERVICE EPaymentsService bPayService = new EPaymentsService(); Serv
我使用 play 2.6.0 和 scala 2.11.8 我一直使用 play 的 WSClient,使用相同的配置没有任何问题: 应用程序.conf: play { ws.timeout.co
基本上,我正在尝试使用 Java 在我的 SBT 应用程序中创建自定义 WSClient。由于我不需要任何注入(inject)依赖项,因此我使用 documentation 中显示的方法。 。要创建自
这是我想要做的 package gc.services.http.playWs.lmi import com.softwaremill.macwire.Macwire import play.api.
我有一个注入(inject)了 WSClient 依赖项的类: @Singleton class MyApiService @Inject() (wsclient: WSClient, conf: C
我们正在使用带有 java 的 play2.5。我有一个自定义类,即 A 类,我在其中通过 DI 注入(inject)了一个 WSClient 对象作为自定义类 A 的属性。我们创建此自定义类 A 的
我正在尝试使用来自 Play Framework 的 WSClient API 调用网络服务。主要问题是我想在不超过最大有效载荷大小的情况下传输巨大的 JSON 有效载荷(超过 2MB)。 为此,我想
用例实际上非常典型。许多 Web 服务使用您在 session 开始时检索的授权 token ,您需要在后续请求中发回这些 token 。 我知道我可以这样做: lazy val myData = {
我是一名优秀的程序员,十分优秀!