Playframework 2.0 具有不同查询参数的Playframework路由

Playframework 2.0 具有不同查询参数的Playframework路由,playframework-2.0,Playframework 2.0,我的搜索控制器中有两种方法 searchBoundingBox-执行边界框搜索,并需要边界框纬度和经度值。 搜索-执行距离搜索(从中心点执行基于距离的搜索) 我在路由文件中定义了两条路由,如下所示 #Search #bounding box GET /search controllers.Search.searchBoundingBox(swLatitude:java.lang.String,swLongitude:java.lan

我的搜索控制器中有两种方法

searchBoundingBox-执行边界框搜索,并需要边界框纬度和经度值。 搜索-执行距离搜索(从中心点执行基于距离的搜索)

我在路由文件中定义了两条路由,如下所示

#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)
但是,当我在第二条路线(基于距离)中创建查询时,它没有得到解决


任何解决方法!!!(注意,如果我更改路线的顺序,则边界框搜索将失败)

如果您被迫使用查询参数,则可以对两个搜索使用一个操作作为解决方法:

GET     /search   controllers.Search.search
并自行获取查询参数:

斯卡拉:

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

因此,您可以拆分操作:

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

您可以看到,这不是一个好的类型安全API,因此最好遵循Julien和biesior的方法。

当两个路由使用相同的方法(
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)

顺便说一句,您不需要为常见类型(如
String
Integer
等)提供完整路径。如果您的Java方法使用带有Scala
Int
的整数类型构造路由,路由器如何猜出哪个路由是正确的?它们没有参数(比如/search/:latitute/:longitude)。查询字符串参数SOKAY无法识别路由,这是播放路由限制。我认为你可以在ROR概念上做到这一点,REST上的路径最能定义实体或关系,在纬度和经度上没有层次结构这很难看,但我们最终使用了类似的东西
#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)