Playframework 如何分离路由和查询参数?

Playframework 如何分离路由和查询参数?,playframework,Playframework,假设我有一条路线 POST /api/{id}/{application} Application.doSomething Application.doSomething如何方便地访问所有查询参数,包括“id”和“Application” 如果我称之为 curl -X POST -d 'id=test&application=test' -v /api/12345/myapp 然后request.params“id”和“application”将设置为路由参数“12

假设我有一条路线

POST       /api/{id}/{application}    Application.doSomething
Application.doSomething如何方便地访问所有查询参数,包括“id”和“Application”

如果我称之为

curl -X POST -d 'id=test&application=test' -v /api/12345/myapp
然后request.params“id”和“application”将设置为路由参数“12345”和“myapp”,而不是查询参数“test”

我看不出如何在不手动解析request.params'body'的情况下访问它们,这有点愚蠢


编辑:对不起,可能不太清楚。假设doSomething控制器将所有查询参数保存在键值存储中的某个位置。用于此id和应用程序。这完全是任意键。因此,现在使用这种结构,您不能将“id”和“application”作为键,因为我使用了这些名称作为路由参数,这不应该是客户机所关心的。基本上,我只需要有一个正常的查询参数访问,没有发挥把路线参数在同一桶

我认为你混淆了路线的用法。这一行:

POST       /api/{id}/{application}    Application.doSomething
设置当您收到请求时,例如
/api/12345/myapp
,中间部分将与请求匹配,并且将提取您定义的任何参数

在示例请求
/api/12345/myapp
中,参数
id
将获得值12345,参数
application
将获得值myapp

在您的请求中,当您调用
/api/12345/myapp
时,参数已经分配,片段
id=test&application=test
被忽略


您应该像调用
/api/test/test/
那样调用它,以获得您期望的结果。

Play为您做这些事情。Play甚至可以根据请求参数绑定复杂的Java对象。我认为这种POST请求反序列化是默认的

您创建了一个由请求参数发送的Java对象:

public class MyObject {
  public String id;
  public String application;
}
应用程序中控制器方法中,此对象是您的参数:

public static void doSomething(MyObject aObject) {
   // do your thing
}

有一种访问原始查询字符串的简单方法:

在控制器操作内访问对象,例如

public static void action(){
     String qs = request.querystring;
}
也就是说,在查询字符串和路由中使用相同的参数名听起来不是很清楚,REST-wise

在路由文件中使路由“id”和“应用程序”名称更加明确,这样就不会有更多冲突

[编辑1]

我知道查询字符串可以是“any”参数:但是,如果您将其命名为:

POST       /api/{object_id}/{play_application}    Application.doSomething
我真的怀疑你们会不会发生碰撞;-)

[编辑2]

在Java中解析查询字符串非常简单,例如


在游戏中创建“参数”地图的大部分复杂性是由于结合了post/get/route/etc。。。因此,你不能要求play为你做这项工作,而这样做会破坏其他人的工作

是的,但关键是您需要使用任何查询参数调用/api/{id}/{application},包括我用于构建url的参数。所以它不总是id,也不总是应用程序,它可以是任何东西。然后所有这些参数都会发生变化。但是现在我在查询参数和路由参数之间存在冲突,所以我不能再使用任何查询参数了。是的,但问题是您需要使用任何查询参数调用/api/{id}/{application},包括我用于构建url的参数。所以它不总是id,也不总是应用程序,它可以是任何东西。然后所有这些参数都会发生变化。但是现在我在查询参数和路由参数之间有冲突,所以我不能再使用任何查询参数了。呃,也许我是在解释它。我希望我已经更新了原来的帖子,以便更好地说明它。@Eugene为什么要调用ROUTE参数并获得相同的参数?这没有多大意义。。。如果您想通过querystringNo传递它,那么应该调用/api/application/without/id/,而不是我是否想调用route并获取相同的参数。只是api可以接收任何get参数。它可以是“id=…”或“application=…”。在这种情况下,API会忽略这些参数,因为已经有名为“id”或“application”的路由参数!当然可以,但是我需要自己解析querystring。如何更明确地命名它们______MYPRIVATEID98123981239?所以它不太可能作为查询参数出现?嗯,原则上这并不能真正解决问题,不是吗?@Eugene自己解析查询字符串很简单;让你的用例为Play工作意味着Play不再为其他任何人工作。。。因此,我认为我的解决方案能够解决您的问题!(注:是的,这不太可能作为一个查询参数出现:)好吧,我知道,但我希望它能以某种方式更优雅地完成,我只是错过了一些方法或地图…我不主张打破现有的功能,但是,只需在request.params上添加一个方法,它将只返回查询参数的映射,这将非常有用。特别是考虑到play将路由参数和查询参数本身结合在一起,但您不能只访问查询参数…@eugene我不得不坚持认为自己解析查询字符串非常容易,因此将
params
映射参数化(很抱歉这个双关语)这完全是过度工程化了…request.querystring可以用于GET参数,但在我的示例中,我使用的是POST,所以我可以通过request.body和read-InputStream(niiice!)或request.params.GET(“body”)访问body参数,这真是愚蠢。是的,之后我需要自己分析它。我建议对你的问题进行一些小的修改,以便比你不要求修改
参数更清楚(这是我最初理解的:)。请查看它们并随时改进/拒绝!