2013-11-20 42 views

回答

0

可惜的是有Java的解決方案,但也許你會「轉換」它斯卡拉,總體思路是:

  • 抓住HEAD請求發送到專用方法
  • 方法autoHead(String originalPath)使用WebServices轉發參數發送GET請求並僅返回響應的狀態。
  • 它增加了額外的標頭X_FORWARD_FROM_HEAD因此,如果您的操作是在每次打擊後向DB記錄某些內容,則可以避免出現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) 
+0

這樣獲得HEAD請求後,它必須發送一個GET請求到localhost THEN,sen d頭部作爲對HEAD請求的響應。我對嗎? 我認爲這對服務器性能不利。 有沒有辦法做這樣的事情? 'Ok(views.html.content())'或'SimpleResult(header = ResponseHeader(200),body = views.html.content())' 不希望消息體,但請求頭與內容-Length http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9.4 – user3013111

0

您可以添加HEAD路線,旁邊的GET路線,像這樣:

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

在實現方法,你可以調用GET方法,並傳遞一個標誌,以壓低身體,我猜。

0

什麼返回EmptyContent作爲內容

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

不想在消息體但內容長度 HTTP請求頭:// WWW。 w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9.4 – user3013111