【问题标题】:Play framework 2.1 HTTP HEAD method response播放框架2.1 HTTP HEAD方法响应
【发布时间】:2013-11-20 12:57:04
【问题描述】:

如何在 scala play framework 2.1 上返回唯一的响应标头(HTTP HEAD 方法)?

【问题讨论】:

    标签: scala playframework playframework-2.1


    【解决方案1】:

    不幸的是,有 Java 解决方案,但也许您会将其“转换”为 Scala,一般概念是:

    • Catch HEAD 请求将其发送到专用方法
    • 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)
    

    【讨论】:

    • 这样,在收到 HEAD 请求后,它必须向 localhost 发送 GET 请求,然后,将标头作为对 HEAD 请求的响应发送回。我对吗?我认为这对服务器性能不利。有没有办法做这样的事情? Ok(views.html.content())SimpleResult(header = ResponseHeader(200), body = views.html.content()) 不想要消息正文,但需要 Content-Length w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9.4 的请求标头
    【解决方案2】:

    您可以在 GET 路由旁边添加 HEAD 路由,如下所示:

    GET   /assertion                        controllers.Assertion.get
    HEAD  /assertion                        controllers.Assertion.head
    

    在实现方法中,你可以调用GET方法并传递一个标志来抑制body,我猜。

    【讨论】:

      【解决方案3】:

      将 EmptyContent 作为内容返回怎么样

           Action {
              ....
              Ok(EmptyContent())  
           }
      

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-08-10
      • 2012-12-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-28
      相关资源
      最近更新 更多