2013-05-14 87 views
68

我正在設置一個REST Web服務,只需要儘可能快地回答YES或NO。http HEAD vs GET性能

設計一個HEAD服務似乎是最好的方式,但我想知道如果我真的會獲得一些時間而不是GET請求。

我想我的身體流不能在我的服務器上打開/關閉(約1毫秒?)。 由於要返回的字節數量非常少,因此在傳輸過程中,我是否可以獲得IP包數?

在此先感謝您的回覆!

編輯:

爲了進一步解釋方面:

  • 我有一組執行一些過程,如果他們是處於活動狀態的REST服務。
  • 我有另一個REST服務,指示所有這些第一個服務的狀態。

自去年服務將通過一個非常大的客戶端組(一個調用預期每5ms),我如果使用HEAD方法可以是一個有價值的優化想知道的被稱爲非常頻繁?約250個字符在響應主體中返回。 HEAD方法至少可以獲得這些250個字符的傳輸,但這會帶來什麼影響?

我試圖基準的兩種方法(HEAD VS GET)之間的差額,運行1000次電話,但看完全沒有增益(< 1毫秒)...

回答

103

RESTful URI應代表服務器上的「資源」。資源通常作爲記錄存儲在數據庫或文件系統上的文件中。除非資源較大或在服務器上檢索速度較慢,否則使用HEAD而不是GET可能無法獲得可衡量的收益。這可能是檢索元數據沒有比檢索整個資源更快。

您可以實現這兩個選項並對它們進行基準測試,以查看哪個更快,但不是微觀優化,而是專注於設計理想的REST接口。從長遠來看,乾淨的REST API通常比可能或不可能更快的kludgey API更有價值。我並不沮喪使用HEAD,只是建議您只有在「正確」設計時才使用它。

如果你真的需要的信息是對可以很好地在HTTP頭中表示,或以檢查是否存在資源與否,HEAD可能會很好地工作的資源元數據。

例如,假設你要檢查,如果資源123存在。一個200表示「是」和404意思是「不」:

HEAD /resources/123 HTTP/1.1 
[...] 

HTTP/1.1 404 Not Found 
[...] 

但是,如果「是」或「否」從您的REST服務要的是資源本身的一部分,而不是元數據,你應該使用GET

+0

最好的事情總是很簡單,就像這個答案。瞧! – 2015-12-08 09:08:47

+0

精彩回答!我有一個問題:使用它作爲'touch'命令來更新服務器上的帖子查看次數呢?帖子數據已經通過普通的'/ posts'調用獲得,所以我只想在用戶以某種方式與帖子交互後更新查看次數。 – aalaap 2017-09-04 11:12:55

+0

@aalaap如果您要爲'HEAD'請求更新查看計數器,那麼您也應該爲'GET'請求執行此操作。決定使用'GET'還是'HEAD'最終取決於HTTP客戶端。對於這兩種請求類型,您的服務器都應該採用相同的方式,但響應「HEAD」時沒有響應主體。至於這是否是實現類似查看計數器的好方法,我不確定。 – 2017-09-28 21:16:16

8

你的表現將很難被改變使用HEAD請求而不是GET請求。

此外,當您希望它是REST-ful並且您想要獲取數據時,您應該使用GET請求而不是HEAD請求。

0

您可以輕鬆地做一個小測試來測量自己的表現。我認爲性能的差異是可以忽略的,因爲如果你只是在體內返回'Y'或'N',那麼它就是附加到已經打開的流上的一個額外字節。

我也會去GET,因爲它更正確。您不應該在HTTP標頭中返回內容,而僅返回元數據。

3

我不明白你的「身體流是開/關」的關注。響應主體將與http響應頭部在同一個流上,並且不會創建第二個連接(順便說一句,它的範圍是3-6ms)。

這似乎是某種東西的一種非常過早優化的嘗試,就不會做出顯著甚至可測量的差異。真正的區別是REST一般,其中建議使用GET獲取數據一致性..

我的回答是NO,用得到,如果這是有道理的,有使用HEAD沒有性能增益。

10

我強烈反對這種做法。

RESTful服務應該尊重HTTP動詞語義。 GET動詞是爲了檢索資源的內容,而HEAD謂詞不會返回任何內容,例如可以用來查看資源是否已經改變,知道它的大小或類型,檢查它是否是存在等等。

請記住:早期的優化是一切罪惡的根源。

25

我在尋找請求者詢問的同一個問題時發現了這個回覆。我還發現這在http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html

HEAD方法是相同,除了在應答服務器不能返回一個消息體得到的。 HTTP頭中包含的對HEAD請求作出響應的元信息應該與爲響應GET請求而發送的信息相同。此方法可用於獲取有關請求隱含的實體的元信息,而無需傳遞實體主體本身。此方法通常用於測試超文本鏈接的有效性,可訪問性和最近的修改。

在我看來,對於請求者問題的正確答案是它取決於REST協議所代表的內容。例如,在我的特殊情況下,我的REST協議被用來檢索相當大的(如超過10K)圖像。如果我有大量這樣的資源被持續檢查,並且考慮到我使用了請求標頭,那麼根據w3.org的建議,使用HEAD請求是有意義的。

1

GET取頭+身體,HEAD只取頭。哪一個更快,這不應該是個問題。我不想看到上面的答案。如果您正在尋找META信息,而不是尋求HEAD,這是爲此目的。