1

こんにちは私はLiftのAPIに以下を使用しています:

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)))

私の問題は、3つのパラメーターのいずれかが欠落している場合、エラーが発生することです。パラメータが欠落している場合、誰かがそれらのいずれかに値を割り当てる方法を手伝ってもらえますか?たとえば、afterがURLにない場合、afterにデフォルト値を割り当てるにはどうすればよいですか?

ありがとう、-ファラン

4

1 に答える 1

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サブタイプをもっと試してみて、理解のために実際に何が行われるかをしっかりと把握することをお勧めします。

お役に立てば幸いです。

于 2011-08-04T11:32:56.510 に答える