【发布时间】:2013-11-20 12:57:04
【问题描述】:
如何在 scala play framework 2.1 上返回唯一的响应标头(HTTP HEAD 方法)?
【问题讨论】:
标签: scala playframework playframework-2.1
如何在 scala play framework 2.1 上返回唯一的响应标头(HTTP HEAD 方法)?
【问题讨论】:
标签: scala playframework playframework-2.1
不幸的是,有 Java 解决方案,但也许您会将其“转换”为 Scala,一般概念是:
autoHead(String originalPath) 方法使用 WebServices 转发参数发送 GET 请求并仅返回响应的状态。X_FORWARD_FROM_HEAD,因此如果您的操作在每次点击后将某些内容记录到数据库中,您可以避免HEAD 请求。代码:
/**
* Tries to get headers of resource with WebServices and return headers only.
*
* @param originalPath Path of the resource
* @return Headers for HEAD request
* @throws IllegalAccessException
*/
public static Result autoHead(String originalPath) throws IllegalAccessException {
WS.WSRequestHolder forwardedRequest = WS.url("http://" + request().host() + request().path());
// this header will allow you to make additional choice i.e. avoid tracking the request or something else
// see condition in index() action
forwardedRequest.setHeader("X_FORWARD_FROM_HEAD", "true");
// Forward original headers
for (String header : request().headers().keySet()) {
forwardedRequest.setHeader(header, request().getHeader(header));
}
// Forward original queryString
for (String key : request().queryString().keySet()) {
for (String val : request().queryString().get(key)) {
forwardedRequest.setQueryParameter(key, val);
}
}
// Call the same path but with GET
WS.Response wsResponse = forwardedRequest.get().get();
// Set returned headers to the response
for (Field f : Http.HeaderNames.class.getFields()) {
String headerName = f.get(null).toString();
if (wsResponse.getHeader(headerName) != null) {
response().setHeader(headerName, wsResponse.getHeader(headerName));
}
}
return status(wsResponse.getStatus());
}
/**
* Checks if request if forwarded from HEAD request
*
* @return true if 'X_FORWARD_FROM_HEAD' header exists and is set to true
*/
public static boolean forwardedFromHead() {
return (request().getHeader("X_FORWARD_FROM_HEAD") != null && "true".equals(request().getHeader("X_FORWARD_FROM_HEAD")));
}
路线:
HEAD / controllers.Application.autoHead(originalPath:String ?= "/")
HEAD /*originalPath controllers.Application.autoHead(originalPath:String)
【讨论】:
Ok(views.html.content()) 或 SimpleResult(header = ResponseHeader(200), body = views.html.content()) 不想要消息正文,但需要 Content-Length w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9.4 的请求标头
您可以在 GET 路由旁边添加 HEAD 路由,如下所示:
GET /assertion controllers.Assertion.get
HEAD /assertion controllers.Assertion.head
在实现方法中,你可以调用GET方法并传递一个标志来抑制body,我猜。
【讨论】:
将 EmptyContent 作为内容返回怎么样
Action {
....
Ok(EmptyContent())
}
【讨论】: