Playframework 游戏2:是否可以使用405方法“不允许”进行响应;而不是",;“404未找到”;如果存在路由,但不适用于当前方法
当我将类似的内容放入我的routes文件时:Playframework 游戏2:是否可以使用405方法“不允许”进行响应;而不是",;“404未找到”;如果存在路由,但不适用于当前方法,playframework,Playframework,当我将类似的内容放入我的routes文件时: GET /foo com.example.controllers.FooController.foo 然后向该资源发出一个请求,该请求不是GET,例如POST/foo,默认路由器以404和“未找到操作”响应。是否有可能让它检测到不同方法的资源存在并输出状态代码405(不允许使用方法)?您需要在GlobalSettings类中重写onHandlerNotFound方法: 在未找到服务请求的操作时调用。默认行为是呈现框架的默认404页面。这是通过返回n
GET /foo com.example.controllers.FooController.foo
然后向该资源发出一个请求,该请求不是
GET
,例如POST/foo
,默认路由器以404和“未找到操作”响应。是否有可能让它检测到不同方法的资源存在并输出状态代码405(不允许使用方法)?您需要在GlobalSettings
类中重写onHandlerNotFound
方法:
在未找到服务请求的操作时调用。默认行为是呈现框架的默认404页面。这是通过返回null来实现的,因此Scala引擎处理onHandlerNotFound。通过重写此方法,可以提供一个替代404页面
更多详细信息。只需在应用程序文件夹中添加类Global并覆盖onHandlerNotFound方法,如下所示:
import play.*;
import play.mvc.*;
import play.mvc.Http.*;
import play.libs.F.*;
import static play.mvc.Results.*;
public class Global extends GlobalSettings {
public Promise<Result> onHandlerNotFound(RequestHeader request) {
return Promise.<Result>pure(
status(405, "Method Not Allowed")
);
}
}
这是我的博客。这是我自己发现的。是否有一种有效的方法来检查同一路径是否存在路由,但存在另一种方法,或者我必须迭代所有方法,发送
OnRouterRequest
,并检查是否有任何结果不无
?为什么这是一个错误?对于REST接口(这是我用Play构建的),为同一路径定义多个请求方法是非常常见的。。。e、 g.todo列表可以使用GET/todos/:id
查看todo,使用PUT/todos/:id
添加具有指定id的todo……但正如我所说,这在REST接口中很常见,并且Play路由器也支持它。在我的todo示例中,我可以定义一个类似于GET/todos/:id controllers.ToDoController.getTodo(id:Long)
的路由,以及另一个类似于PUT/todos/:id controllers.todocontrollers.putTodo(id:Long)
的路由。但是,必须正确记录接口。是否有一种有效的方法来检查同一路径是否存在路由,但存在另一种方法。
很抱歉,我无法查看此字段。我建议问新问题。我已经发现没有,因为Router.routes
是一个PartialFunction
,所以我只能使用isDefinedAt
对我在路由中使用的所有请求方法进行迭代。我做了类似的操作,但对于不存在的路径,您的解决方案也会以405响应。也就是说,如果我只定义了一个路由/foo
,并且我调用/bar
,那么您的示例也将响应405,但在这种情况下,我需要404。
override def onRouteRequest(req: RequestHeader): Option[Handler] = {
(req.method, req.path) match {
case ("GET", "/") => Some(controllers.Application.index)
case ("POST", "/submit") => Some(controllers.Application.submit)
case _ => None
}
}