您好我在Lift中使用以下内容:
case "api" :: "all" :: _ Get req => for {
val after <- req.param("after")
val before <- req.param("before")
val limit <- req.param("limit")
} yield JsonResponse(json(ResponseLimitAfterBefore(limit.toInt,
after.toString,
before.toString)))
我的问题是如果缺少三个参数中的任何一个,就会出错。如果缺少任何参数,任何人都可以帮助我如何为任何一个值分配值?例如,如果after不在url中,那么如何为之后的默认值分配?
谢谢, -Faran
答案 0 :(得分:2)
如果你似乎不明白Scala中的理解是如何工作的。请考虑以下事项:
scala> val x: Option[String] = Some("X")
x: Option[String] = Some(X)
scala> val y: Option[String] = None
y: Option[String] = None
scala> for(xx <- x; yy <- y) yield yy
res0: Option[String] = None
scala> for(yy <- y; xx <- x) yield xx
res1: Option[String] = None
请注意,即使xx
有值,结果仍为None
。鉴于req.param
为您提供Box[String]
(类似于Option[String]
),您可以执行以下操作(如果您想要响应任何参数传递):
JsonResponse(json(
ResponseLimitAfterBefore(
limit.map(_.toInt).openOr(0),
after.openOr("after default"),
before.openOr("another default")
)))
或者,如果您只想提供一个默认的响应,而不是一个典型的默认响应:
(for {
after <- req.param("after")
before <- req.param("before")
limit <- req.param("limit")
} yield JsonResponse(json(ResponseLimitAfterBefore(
limit.toInt, after, before)))
) openOr BadRequestResponse()
我建议更多地使用LiftResponse子类型,并牢固掌握理解的实际内容。
希望有所帮助。