2015-08-28 90 views
0

我正在使用Apache CXF Jax-RS來實現RESTfull服務。我實現了一個GET調用如下圖所示:爲什麼Apache CXF-Jax RS允許'GET'請求佔用'HEAD'請求?

@GET 
@Path("getSomething") 
@Produces("application/xml") 
public String getSomething() { 
    return null; 
} 

這是工作爲我好,但一個錯誤上引發這個測試儀能夠使用該服務的操作與HEAD請求(POST和其他調用失敗後)。我做了一些研究,發現HEAD請求與GET類似,唯一的區別是它不返回正文。所以我有幾個關於這個問題。

1)爲什麼JAX RS允許使用@GET註釋的操作接收HEAD請求,而它有一個單獨的@HEAD註釋可用?

2)難道這會導致什麼樣的問題在我的應用

3)如果我不允許@ GET操作採取@HEAD操作,我能我做到這一點?

回答

1

1)它是在定義JAX-RS 1.0

HEADOPTIONS請求接收額外的自動支持。在接收到HEAD請求的實現必須:

  1. 來電HEAD或與請求方法指示符註釋的方法,如果沒有本,
  2. 呼叫與請求方法指示符註釋爲GET和丟棄的方法任何返回的實體。

請注意,選項2可能導致實體創建顯着時的性能下降。

2)不,因爲你的方法是安全的,請參閱Wikipedia

GET方法是一種安全的方法(或nullipotent),這意味着調用它不會產生任何副作用。換句話說,檢索或訪問記錄不會改變它。

3)你可以註釋的另一種方法與HEAD,看到Jersey 2.22 User Guide

默認情況下,JAX-RS運行時會自動支持方法HEADOPTIONS,如果沒有明確落實。