使用Play Framework获取请求参数?

时间:2013-02-12 22:51:05

标签: java playframework-2.0

我正在学习游戏框架,并了解我可以将/manager/user等请求映射为:

  GET      /manage/:user    Controllers.Application.some(user:String)

如何映射/play/video?video_id=1sh1之类的请求?

4 个答案:

答案 0 :(得分:23)

您至少有两种可能性,我们称之为approach1approach2

  1. 在第一种方法中,您可以使用某个默认值声明路径参数。 0是一个很好的候选者,因为在它之上建立一些条件是最容易的。它也是typesafe,并预先验证自己。我会在开头推荐这个解决方案。
  2. 第二种方法直接从请求中读取params作为String,因此您需要将其解析为整数,并在需要时另外验证。
  3. routes

    GET     /approach1      controllers.Application.approach1(video_id: Int ?=0)
    GET     /approach2      controllers.Application.approach2
    

    动作:

    public static Result approach1(int video_id) {
        if (video_id == 0) return badRequest("Wrong video ID");
        return ok("1: Display video no. " + video_id);
    }
    
    public static Result approach2() {
        int video_id = 0;
    
        if (form().bindFromRequest().get("video_id") != null) {
            try {
                video_id = Integer.parseInt(form().bindFromRequest().get("video_id"));
            } catch (Exception e) {
                Logger.error("int not parsed...");
            }
        }
    
        if (video_id == 0) return badRequest("Wrong video ID");
        return ok("2: Display video no. " + video_id);
    }
    

    PS: LOL我刚刚意识到你想要使用字符串标识符...无论如何两种方法都是类似的:)

答案 1 :(得分:19)

我会简单地使用:

GET /play/video      Controllers.Application.video(video_id:String)

在控制器你当然会有,例如:

public static Result video(String video_id) {

     return ok("We got video id of: " + video_id);

}

或者,您不必添加video_id:String,因为默认情况下播放似乎将参数视为String,因此它也可以这样工作(至少在最新播放时):

GET /play/video      Controllers.Application.video(video_id)

现在,您应该在地址栏中输入localhost:9000/play/video?video_id=1sh1来查看哪些内容:

  

我们的视频ID为:1sh1

添加更多参数很简单,如下所示:

GET     /play/video                      controllers.Application.video(video_id:String, site:String, page:Integer)

控制器:

public static Result video(String video_id, String site, Integer page) {

    return ok("We got video id of: " + video_id + " site: " + site + " page: " + page);

}

现在,您应该在地址栏中输入localhost:9000/play/video?video_id=1as1&site=www.google.com&page=3来查看哪些内容:

  

我们的视频ID为:1as1网站:www.google.com page:3

欢迎你^^。

答案 2 :(得分:4)

我不太确定我是否得到了你的意思如果你只想将一个网址映射到控制器中,那么biesior的答案是完美的,但如果你的意思是提交一个带有get方法的表单

@helper.form(action = routes.YourController.page1()) {

 }

并在网址中以url-rewrited格式包含表单的参数,如

page1/foo/bar instead of page1?param1=foo&param2=bar 

没有办法做到这一点,因为那是http规范

我经常通过在控制器中获取第一个函数中的参数来绕过这个限制,然后将它们重定向到另一个视图,就像下面一样

public static Result page1(){
   String param1 = Form.form().bindFromRequest().get("param1");
   String param2= Form.form().bindFromRequest().get("param2");

   return ( redirect( routes.YourController.page2(param1,param2)));
}      

然后在page2中有任何内容

public static Result page2(String param1,String param2){

        ...............
 }

在路线文件中有这个:

GET  page2/:param1/:param2        controllers.YourControllers.page2(param1 : String, param2 : String )

我希望它有所帮助,但我不确定这是最好的做法

答案 3 :(得分:2)

好的,我只是阅读了文档,我理解的是你需要

GET /play/video         Controllers.Application.video()

然后在控制器中调用HttpRequest对象的getQueryString

http://www.playframework.com/documentation/api/2.1.0/java/index.html