使用Play Framework获取请求参数?
我正在学习游戏框架,并了解我可以将/manager/user
类的请求映射为:
GET /manage/:user Controllers.Application.some(user:String)
我如何映射像/play/video?video_id=1sh1
这样的请求/play/video?video_id=1sh1
?
你有至少两种可能性,让我们称之为approach1
和approach2
。
- 在第一种方法中,您可以声明具有某个默认值的路由参数。
0
是很好的候选者,因为在它之上建立一些条件是最容易的。 它也是typesafe
,并预先validation自己。 我会在一开始就推荐这个解决方案。 - 第二种方法直接从请求中读取params作为
String
因此您需要将其解析为整数并另外validation是否需要。
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:大声笑我刚刚意识到你想要使用字符串标识符……无论如何这两种方法都是类似的:)
我会简单地使用:
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
到地址栏现在应该给出打印的视图:
我们得到了videoID: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
到地址栏现在应该给出打印的视图:
我们获得了videoID:1as1网站:www.google.com页面:3
你很受欢迎^^。
我不太确定我是否得到了你的意思如果你只是想在控制器中映射一个url来完成biesior的答案是完美的但如果你的意思是提交一个带有get方法的表单
@helper.form(action = routes.YourController.page1()) { }
并使用url-rewrited格式在url中使用表单的参数
page1/foo/bar instead of page1?param1=foo¶m2=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 )
我希望它有所帮助,但我不确定这是最好的做法
好的,我只是阅读了文档,我理解的是你需要的
GET /play/video Controllers.Application.video()
然后在控制器中调用HttpRequest对象的getQueryString
http://www.playframework.com/documentation/api/2.1.0/java/index.html