4

検索コントローラーには2つのメソッドがあります

searchBoundingBox - 境界ボックス検索を行い、境界ボックスの緯度と経度の値を必要とします。検索 - 距離検索を行います (中心点からの距離ベースの検索を行います)。

以下のように、ルート ファイルに 2 つのルートを定義しました。

#Search
#bounding box
GET     /search                             controllers.Search.searchBoundingBox(swLatitude:java.lang.String,swLongitude:java.lang.String, neLatitude:java.lang.String,neLongitude:java.lang.String)

# distance based
GET     /search                             controllers.Search.search(latitude:java.lang.String,longitude:java.lang.String, offset:java.lang.Integer?=0,distance:java.lang.Integer?=50, limit:java.lang.Integer?=10)

しかし、2 番目のルート (距離ベース) でクエリを作成すると、解決されません。

回避策!!!(ルートの順序を変更すると、境界ボックスの検索が失敗することに注意してください)

4

2 に答える 2

5

クエリ パラメータを使用する必要がある場合は、回避策として両方の検索に 1 つのアクションを使用できます。

GET     /search   controllers.Search.search

クエリ パラメータを自分でフェッチします。

スカラ:

def search = Action { request =>
     val latitude = request.queryString.getOrElse("latitude", Seq()).headOption.getOrElse("default")

ジャワ:

public static Result search() {
        String latitude = request().queryString().get("latitude")[0];//of course check if param is in map

したがって、アクションを分割できます。

if(latitude != null)
   searchWithoutBoundingBox()
else
   searchBoundingBox()

これは適切でタイプセーフな API ではないことがわかるので、Julien と biesior のアプローチに従う方がよいでしょう。

于 2012-11-25T08:09:56.817 に答える
3

2 つのルートが同じメソッド ( GET) と同じパス ( /search) を使用する場合、それは正常であり、最初にのみ使用されます。このルールからの逸脱はありません。

Schleichardtが提供する最初の解決策は可能ですが、安全性を最大限に高めるには、入力の種類を厳密に制御する必要があります。

第二に、はるかに高速で簡単な解決策は...ルートのパスが一意であることです。

#bounding box
GET     /search/bound/:swLatitude/:swLongitude/:neLatitude/:neLongitude      controllers.Search.searchBoundingBox(swLatitude: String, swLongitude: String, neLatitude: String, neLongitude: String)

# distance based
GET     /search/distance/:latitude/:longitude   controllers.Search.search(latitude: String, longitude: String, offset: Int?=0, distance: Int?=50, limit: Int?=10)

ところで、Java メソッドが Integer 型構造ルートを Scala で使用する場合String、 、 などの一般的な型へのフル パスを指定する必要はありません。IntegerInt

于 2012-11-25T09:28:38.760 に答える