2016-11-07 101 views
0

作爲每澤西文檔,JAX RS POST API不支持HEAD請求

默認情況下,JAX-RS運行時將自動支持方法HEAD和OPTIONS,如果沒有明確實現。對於HEAD,運行時將調用已實現的GET方法(如果存在)並忽略響應實體(如果已設置)。對於OPTIONS,允許響應頭將被設置爲資源支持的一組HTTP方法。此外,澤西島將返回描述資源的WADL文件。

所以,如果我有一個新澤西POST API,將它不支持HEAD電話嗎?在我的情況下,它只支持OPTIONS呼叫,它返回允許的方法爲POSTOPTIONS。你如何去支持HEAD calll?

回答

2

你給了一半的答案你的問題的名言:

對於HEAD運行時將調用實現GET方法(如果存在的話),並忽略響應實體(如果設置)。

所以以啓用enpoint HEAD方法,你有兩個選擇:

  • 實現GET和澤西會自動提供HEAD
  • 的默認實現執行HEAD明確

POST方法不能用於提供默認HEAD實現的原因是POST方法既不安全也不冪級(如HTTP標準中定義的)。這意味着如果有人調用POST方法,他們必須假定它會對應用程序/資源狀態產生影響。另一方面,GET和HEAD都是安全和冪等的,所以它們不能改變狀態。

爲了回答你問題的第二部分 - 實施頭不從執行其他HTTP方法不同:

import javax.ws.rs.GET; 
import javax.ws.rs.HEAD; 
import javax.ws.rs.Path; 
import javax.ws.rs.Produces; 
import javax.ws.rs.core.MediaType; 
import javax.ws.rs.core.Response; 

@Path("api/ping") 
public class MyResource { 

    @GET 
    @Produces(MediaType.TEXT_PLAIN) 
    public String ping() { 
     return "pong!"; 
    } 

    @HEAD 
    public Response getHeaders() { 
     return Response.status(200). 
       header("yourHeaderName", "yourHeaderValue").build(); 
    } 
}