使用 Play 框架获取请求参数?

2022-09-01 15:24:03

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

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

如何映射这样的请求?/play/video?video_id=1sh1


答案 1

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

  1. 在第一种方法中,您可以使用一些默认值声明路由参数。 是很好的候选者,因为在其上构建一些条件是最容易的。也是 ,并预先验证自身。我会在一开始就推荐这个解决方案。0typesafe
  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);
}

附言:哈哈,我刚刚意识到你想使用字符串标识符...无论如何,这两种方法将是相似的:)


答案 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);

}

或者,您不必添加,因为 play 似乎默认将参数视为 String,因此它的工作方式也如下所示(至少在最新的 play 中):video_id: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 页: 3

欢迎您^^。


推荐