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

时间:2012-03-06 13:19:28

标签: 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'将设置为ROUTE参数'12345'和'myapp',而不是查询参数'test'。

我无法看到如何在没有手动解析request.params'body'的情况下访问它们,这有点傻。

编辑:对不起,也许不是很清楚。假设doSomething控制器将所有查询参数保存在某个键值存储中。对于这个id和应用程序。它真的完全是任意键。所以现在使用这种结构你不能将'id'和'application'作为键,因为我已经将这些名称用作路由参数,这不应该是客户端的关注点。基本上我只需要访问普通的查询参数,而无需将路由参数放在同一个桶中!

3 个答案:

答案 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结合起来...所以你不能要求游戏以一种破坏它的方式为你完成工作为了其他人!