我正在学习游戏框架,并了解我可以将/manager/user
等请求映射为:
GET /manage/:user Controllers.Application.some(user:String)
如何映射/play/video?video_id=1sh1
之类的请求?
答案 0 :(得分:23)
您至少有两种可能性,我们称之为approach1
和approach2
。
0
是一个很好的候选者,因为在它之上建立一些条件是最容易的。它也是typesafe
,并预先验证自己。我会在开头推荐这个解决方案。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: 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¶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 )
我希望它有所帮助,但我不确定这是最好的做法
答案 3 :(得分:2)
好的,我只是阅读了文档,我理解的是你需要
GET /play/video Controllers.Application.video()
然后在控制器中调用HttpRequest对象的getQueryString
http://www.playframework.com/documentation/api/2.1.0/java/index.html