Как извлечь параметры POST в API - Lift Framework - PullRequest
1 голос
/ 04 августа 2011

Привет, я использую следующее для моего API в 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, как я могу назначить значение по умолчанию для after?

Спасибо, -Faran

1 Ответ

2 голосов
/ 04 августа 2011

Если кажется, что вы не понимаете, как работают понимания в 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, а также получить четкое представление о том, что на самом деле делают понимания.

Надеюсь, это поможет.

...