Ember.js play framework 2.2.2路由多个不同的查询参数,Ember-数据重定向状态
我正在使用play 2.2.2。我有这种形式的APIEmber.js play framework 2.2.2路由多个不同的查询参数,Ember-数据重定向状态,ember.js,playframework,playframework-2.0,Ember.js,Playframework,Playframework 2.0,我正在使用play 2.2.2。我有这种形式的API /users?token=abcd /users?resetToken=abcd 我已按如下方式配置我的路线: GET /users controllers.X.method(token: String) GET /users controllers.Y.method(resetToken: String) 现在,当我调用/users?resetToken=tokenvalue时,我得到以下错误 For request
/users?token=abcd
/users?resetToken=abcd
我已按如下方式配置我的路线:
GET /users controllers.X.method(token: String)
GET /users controllers.Y.method(resetToken: String)
现在,当我调用/users?resetToken=tokenvalue时,我得到以下错误
For request 'GET /users?resetToken=tokenvalue' [Missing parameter: token]
我可以通过将两个API路由到同一个方法,然后检查方法内的查询参数来解决这个问题。但是我想将API路由到两个不同的方法,因为每个方法都有访问限制。其中一个API只能在登录后访问,而另一个API可以在登录/不登录的情况下访问
你能帮我解决这个问题吗
(添加更多信息:)
我尝试了以下方法:
GET /users controllers.A.genericMethod()
GET /usersByToken/:token controllers.X.method(token: String)
GET /usersByResetToken/:token controllers.Y.method(token: String)
在控制器A中
public static Promise<Result> genericMethod(){
Map<String, String[]> queryParams = Context.current().request().queryString();
String[] tokens = queryParams.get("token");
String[] resetTokens = queryParams.get("resetToken");
if (tokens != null && tokens.length == 1) {
return Promise.pure((Result) redirect(controllers.routes.X.method(tokens[0])));
} else if (resetTokens != null && resetTokens.length == 1) {
return Promise.pure((Result) redirect(controllers.routes.Y.method(resetTokens[0])));
} else {
ObjectNode node = ControllerHelper.error(ResponseStatus.BAD_REQUEST,
"Required params not set!");
return Promise.pure((Result) badRequest(node));
}
}
它形成了相应的api url
/users?token=abcd
我得到的响应是“303,请参阅其他”,所需的数据没有返回。您不能用相同的方法和路径声明两条路由,幸运的是您不必这样做,您有两种解决方案,首先是声明“可选参数”(@see:)如 另一个解决方案是声明rout w/out参数,因为您仍然可以使用 第二种方法更好,尤其是当您的API有大量可选参数时
注意:我从头开始写的我知道一个api受保护,需要登录,而另一个不受保护 你需要有两条不同的路线,这是最好的方式
GET /users controllers.X.method(token: String)
GET /public/users controllers.Y.method(resetToken: String)
将其合并到一条路由将不允许您有单独的访问限制
你需要把它分成两条路线,一条是私人通道,另一条是公共通道
这显然会改变您的API。您好,在我最近对这个问题的编辑中,我使用了第二种方法。我使用重定向到genericMethod中的相应操作,以强制对相应操作controllers.X.method和controllers.Y.method应用访问限制。我想知道是否可以在不使用重定向的情况下调用相应的操作及其访问限制。不要使用重定向到其他操作,而是返回。。。其他操作,如:
返回其他操作(arg1、arg2)代码>无论如何TBH我不知道它将如何与Promise
一起工作简而言之,是否可以从另一个操作调用一个操作及其访问限制?我尝试了返回其他操作(arg1)
。但问题是,当我以这种方式调用时,我作为注释添加到操作的访问限制不适用。IMHO:向main方法添加限制,并确保没有向otherAction添加路由,以便您的主操作将检查它,最糟糕的问题是,如果您需要使用不同的访问权限…谢谢您的建议。不幸的是,我无法更改API。URL由余烬数据生成。
this.store.find('user', {token: "abcd"});
/users?token=abcd
GET /users controllers.X.action(token ?= null, resetToken ?= null)
public static Result action(String token, String resetToken){
if (token==null) debug("No token given...");
// etc
}
GET /users controllers.X.action()
public static Result action(){
DynamicForm dynamicForm = Form.form().bindFromRequest();
String token = dynamicForm.get("token");
if (token==null) debug("No token given...");
// etc
}
GET /users controllers.X.method(token: String)
GET /public/users controllers.Y.method(resetToken: String)