0

ユーザーが呼び出した REST サービスを解析するために、Spray に次のコードがあります。

val route = {
  pathPrefix("v0") {
    pathPrefix("pets") {
      pathEndOrSingleSlash {
        pathEnd {
          get {
            complete("/v0/pets")
          }
        } ~
        get {
          complete("/v0/pets/")
        }
      } ~
      parameters('id ?) {
        id =>
          get {
            complete("/v0/pets?id=" + id)
          }
      }
    }
  }
}

問題は、期待どおりに動作しないことです。私はコードから次の動作を期待しています:

http://127.0.0.1/v0/pets => /v0/pets
http://127.0.0.1/v0/pets/ => /v0/pets/
http://127.0.0.1/v0/pets?id=1234 = > /v0/pets?id=Some(1234)

しかし、クエリに対して次の結果が得られます。

http://127.0.0.1/v0/pets => /v0/pets
http://127.0.0.1/v0/pets/ => /v0/pets
http://127.0.0.1/v0/pets?id=1234 => /v0/pets
4

2 に答える 2

2

ここでの問題の 1 つは、あなたのルートがそれの存在と不在idの両方を処理するように宣言されていることです (そして、それは処理です)。optionalparameterv0/pets

それを行う1つの方法(また、リクエストのみを処理したい場合もあると思いgetます)。

基本的に、ルートでid オプションではないことを宣言するだけです。parameter

val route = get {
  pathPrefix("v0") {
    pathPrefix("pets") {
      pathEnd {
        parameter('id) { id =>
          complete("/v0/pets?id=" + id)
        } ~ complete("/v0/pets")
      } ~
      pathSingleSlash {
        complete("/v0/pets/")
      }
    }
  }
}

idもう 1 つの方法は、基本的にがオプションのパラメーターであるという事実を悪用するだけなので、次のようにパターン マッチするだけOptionです。

val route = {
  pathPrefix("v0") {
    pathPrefix("pets") {
      pathEnd {
        get {
          parameters('id ?) { id =>
            id match {
              case Some(id) => complete("/v0/pets?id=" + id)
              case None => complete("/v0/pets")
            }
          }
        }
      } ~
      pathSingleSlash {
        get {
          complete("/v0/pets/")
        }
      }
    }
  }
}
于 2016-01-07T14:37:01.450 に答える