我的搜索控制器中有两种方法
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)
但是当我在第二条路线(基于距离)中创建一个查询时,它没有得到解决。
任何变通方法!!!(请注意,如果我更改路线的顺序,则边界框搜索失败)
答案 0 :(得分:3)
如果您被迫使用查询参数,则可以对两个搜索使用一个操作作为解决方法:
GET /search controllers.Search.search
并自己获取查询参数:
Scala的:
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的方法。
答案 1 :(得分:3)
当两条路线仅使用相同的方法(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
的路由,则不需要提供常见类型的完整路径,如Integer
,Int
等。