【问题标题】:Get request parameter with Play Framework?使用 Play Framework 获取请求参数?
【发布时间】:2013-02-12 22:51:05
【问题描述】:

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

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

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

【问题讨论】:

  • /play/video?video_id=:id Controllers.Application.vide(id:String)
  • 我希望这行得通。听起来合乎逻辑
  • 好吧不行,有什么方法可以调用来提取它

标签: java playframework-2.0


【解决方案1】:

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

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

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:大声笑我刚刚意识到你想使用字符串标识符...无论如何这两种方法都是相似的:)

【讨论】:

  • 如果路由是POST方法,并且参数作为表单参数添加,你知道有没有办法使用方法1?当我尝试时,控制器无法识别传入的参数值......
【解决方案2】:

我会简单地使用:

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,因为默认情况下play 似乎将参数视为字符串,所以它也可以这样工作(至少在最新的play 中):

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 页面:3

不客气^^。

【讨论】:

    【解决方案3】:

    如果您只是想将 url 映射到控制器中的功能,我不太确定我是否明白您的意思,biesior 的答案是完美的,但如果您的意思是使用 get 方法提交表单,例如

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

    并在 url 中以 url 重写格式包含表单的参数,例如

    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 )
    

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

    【讨论】:

      【解决方案4】:

      好的,所以我刚刚阅读了文档,我的理解是您需要

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

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

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

      【讨论】:

        猜你喜欢
        • 2018-05-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-11-09
        相关资源
        最近更新 更多