假设我有一条路线
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'将设置为ROUTE参数'12345'和'myapp',而不是查询参数'test'。
我无法看到如何在没有手动解析request.params'body'的情况下访问它们,这有点傻。
编辑:对不起,也许不是很清楚。假设doSomething控制器将所有查询参数保存在某个键值存储中。对于这个id和应用程序。它真的完全是任意键。所以现在使用这种结构你不能将'id'和'application'作为键,因为我已经将这些名称用作路由参数,这不应该是客户端的关注点。基本上我只需要访问普通的查询参数,而无需将路由参数放在同一个桶中!答案 0 :(得分:0)
我认为你混淆了路线的使用。这一行:
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/
一样调用它来获得您期望的结果。
答案 1 :(得分:0)
Play会为你做这些事情。 Play能够绑定请求参数中的复杂Java对象。我认为这个POST请求反序列化是默认的。
您创建了一个由您的请求发送的Java对象参数:
public class MyObject {
public String id;
public String application;
}
在应用程序控制器方法中,此对象是您的参数:
public static void doSomething(MyObject aObject) {
// do your thing
}
答案 2 :(得分:0)
有一种访问原始查询字符串的简单方法:
在控制器操作内部访问'request'对象,例如
public static void action(){
String qs = request.querystring;
}
也就是说,在查询字符串和路由中使用相同的参数名称听起来不太清楚;
在路径文件中使ROUTE'id'和'application'名称更明确,您将不再有碰撞......
[编辑1]
我理解查询字符串可以是'any'参数:如果你命名它仍然是:
POST /api/{object_id}/{play_application} Application.doSomething
我真的怀疑你会发生碰撞; - )
[编辑2]
用Java解析查询字符串非常简单,例如。见https://stackoverflow.com/a/2969715/422670
在Play中创建“params”地图的大部分复杂性都是由于将post / get / route / etc结合起来...所以你不能要求游戏以一种破坏它的方式为你完成工作为了其他人!