我有一个应用程序,需要我为 HEAD 和 GET 动词定义一个动作。另一个应用程序(Mozilla Open Badges)使用两个 HTTP 请求调用我的应用程序。它首先使用 HEAD 来验证我的 URL 看起来是否返回了正确类型的响应,然后对同一 URL 使用 GET 来获取内容。以下方法有效:
GET /assertion controllers.Assertion.index
HEAD /assertion controllers.Assertion.index
...这行得通,但违反了 DRY(不要重复自己)。
我更喜欢这样的东西:
(GET, HEAD) /assertion controllers.Assertion.index
...但这是不允许的。如果 GET 免费为您提供 HEAD,我也会很高兴,但我可能不明白阻止 HEAD 执行 GET 操作的原因。
我想冗余的 Path-to-Action 定义并不是世界末日,但我喜欢尽可能保持代码整洁。
根据 HEAD 的 W3C 规范 (http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html),我相信 Play Framework 2 的行为不正确,因为不允许在为 GET 定义的路由上调用 HEAD:
9.4 HEAD
The HEAD method is identical to GET except that the server MUST NOT return a
message-body in the response. The metainformation contained in the HTTP headers in
response to a HEAD request SHOULD be identical to the information sent in response
to a GET request. This method can be used for obtaining metainformation about the
entity implied by the request without transferring the entity-body itself. This
method is often used for testing hypertext links for validity, accessibility, and
recent modification.