【发布时间】:2017-03-29 09:31:46
【问题描述】:
我有 ServerA,它为客户端公开了一个 API 方法,如下所示:
def methodExposed()= Action.async(json) { req =>
val reqAsModel = request.body.extractOpt[ClientRequestModel]
reqAsModel match {
case Some(clientRequest) =>
myApiService
.doSomething(clientRequest.someList)
.map(res => ???)
case None =>
Future.successful(BadRequest("could not extract request"))
}
}
所以,我有一个客户端请求的案例类,如果我无法从请求正文中提取它,那么我会返回带有消息的 BadRequest,否则我会调用内部 apiService 来执行一些操作请求。
doSomething 对 ServerB 执行 API 调用,可以返回 3 个可能的响应:
- 200 状态
- 我需要提取到案例类的正文的 400 状态
- 500 状态
doSomething 看起来像这样:
def doSomething(list: List[String]) = {
wSClient.url(url).withHeaders(("Content-Type", "application/json")).post(write(list)).map { response =>
response.status match {
case Status.BAD_REQUEST =>
parse(response.body).extract[ServiceBResponse]
case Status.INTERNAL_SERVER_ERROR =>
val ex = new RuntimeException(s"ServiceB Failed with status: ${response.status} body: ${response.body}")
throw ex
}
}
}
现在我有两个问题:
- 由于
200返回时没有body,而400有body,我不知道doSomething的返回类型应该是什么 - 我应该如何在控制器中处理这个问题并在
methodExposed中正确地向客户端返回响应?
【问题讨论】:
-
对于 200 与 400,我会推荐
Future[Either]之类的东西。对于 500,我认为这在很大程度上取决于您通常如何处理应用程序中的故障(或者您是否完全处理它们)。由于doSomething返回Future,您可以通过未来传播失败。 -
@rethab 但是怎么可能,因为 200 我不想在 doSomething 中做任何事情,只需将其滚动到控制器,然后再滚动到客户端,而 400 带有案例类
-
所以右边可能是
Unit。或者可能是一些虚拟的Done对象?
标签: scala http playframework