1

スプレー ルーティングを使用して、別の HTTP メソッドを使用してルートを一致させようとしていますが、GET 要求を実行すると、実際には DELETE、PUT、および GET を通過します。HTTP DELETE や HTTP PUT 以外のすべてのリクエストを拒否するdeleteと考えました。put

これは私の基本的なコードです:

path(Segment ~ Slash.?) { id =>
  delete {
    println("Hello from DELETE")
    //do stuff for delete
    complete("done for DELETE")
  } ~
  put {
    println("Hello from PUT")
    //do stuff for put
    complete("done for PUT")
  } ~
  get {
    println("Hello from GET")
    //do stuff for get
    complete("done for GET")
  }
}

GET リクエストをトリガーすると、アプリの印刷が表示されます。

Hello from DELETE
Hello from PUT
Hello from GET

折り返しの電話か何かを見逃していますか?

4

1 に答える 1

4

いいえ、あなたのコードは (ほぼ) 正しいです。

問題は、スプレーでは、メソッドマッチャーに存在するが抽出 (「パラメーター」や「セグメント」などの何かを「抽出」するディレクティブの 1 つ) の下には存在しないコードが常に実行されることです。

あなたの場合、パスエクストラクタを正しく一致させますが、その後、すべての get put delete などに対してルートが実行されます。

これに対する解決策は、get/put などのすぐ下に「 dynamic 」キーワードを追加することです。欠点は、パフォーマンスがいくらか低下することです。

path(...) {
  get {
    dynamic {
      ...
    }
  }
}

または、メソッドマッチャーが最上位にあり、パスエクストラクタがその下にあるようにコードを再シャッフルすることもできます

get {
   path(...) {
     ...
   }
}
于 2015-01-19T09:19:24.643 に答える