Playframework 游戏2:是否可以使用405方法“不允许”进行响应;而不是",;“404未找到”;如果存在路由,但不适用于当前方法

Playframework 游戏2:是否可以使用405方法“不允许”进行响应;而不是",;“404未找到”;如果存在路由,但不适用于当前方法,playframework,Playframework,当我将类似的内容放入我的routes文件时: GET /foo com.example.controllers.FooController.foo 然后向该资源发出一个请求,该请求不是GET,例如POST/foo,默认路由器以404和“未找到操作”响应。是否有可能让它检测到不同方法的资源存在并输出状态代码405(不允许使用方法)?您需要在GlobalSettings类中重写onHandlerNotFound方法: 在未找到服务请求的操作时调用。默认行为是呈现框架的默认404页面。这是通过返回n

当我将类似的内容放入我的routes文件时:

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
  }
}