如何在API中提取POST参数 - Lift框架

时间:2011-08-04 03:21:23

标签: scala rest lift post-parameter

您好我在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

1 个答案:

答案 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子类型,并牢固掌握理解的实际内容。

希望有所帮助。