2017-02-15 31 views
2

Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content爲什麼對PUT請求的響應不能提供ETag?

原始服務器不能發送一個驗證報頭字段Section 7.2),諸如ETagLast-Modified場,在向PUT的成功響應,除非該請求的表示數據被保存而沒有任何應用於身體的變換(即,資源的新的表示數據與在PUT請求中接收到的表示數據相同)並且驗證器字段值反映新的表示。此要求允許用戶代理知道何時它在存儲器中的表示身體保持爲PUT的結果的電流,因此不需要從原始服務器再次被檢索,並且新驗證器(一個或多個)中所接收的響應可用於將來的條件請求以防止意外覆蓋(Section 5.2)。

我不能完全理解這個部分... 粗體句子似乎與自己矛盾,不是嗎?

注意PUT是具有關於節驗證報頭的唯一動詞(見GET/POST/DELETE/PATCH)。

+0

我沒有在這裏看到一個矛盾。 這裏主要的一點是,如果發生了什麼實際存儲在客戶端發送的內容服務器只能返回一個ETag。如果服務器修改了數據,客戶端將不得不使用後續的GET請求來獲取內容。 –

回答

3

的關鍵點是,服務器可以,或可以不將其存儲之前改變表示。從部分鏈接到您:

給定表示的成功PUT會建議對同一目標資源的後續GET將導致等效表示在200 (OK)響應發送。但是,不能保證這樣的狀態變化是可觀察的,因爲目標...可能受到源服務器的動態處理。

因此,該標準使用驗證器頭的存在或不存在來向用戶代理指示該表示是否已被改變。

如果代表沒有被改變,那麼服務器會返回驗證頭字段,用戶代理可以用它來驗證有條件它只是發出的表示。

如果表示已經改變,則用戶代理的表示,顧名思義,無效的。因此,不返回驗證器標頭,並且用戶代理將必須無條件地執行GET

+1

謝謝,剩下的一個問題是:客戶端有一個資源版本,修改它,將其發送到服務器,該服務器應用額外的修改並將新的表示形式返回給客戶端。在這種情況下,請求的body!= response的正文。爲什麼服務器不能直接在響應中提供新的ETag?客戶端然後可以檢查它的本地ETag是否匹配響應中的ETag並相應地更新其緩存。這將避免客戶再次獲得資源(哪個響應與PUT響應具有完全相同的身體,但這次是與ETag)... – sp00m

+1

@ sp00m:我認爲這裏的困惑在於你假設服務器將響應體中的表示發送回'PUT'。但事實並非如此。如果你控制服務器,那麼你當然可以做到,但它不是標準的一部分。所以一般來說,用戶代理沒有辦法在不做新的(無條件的)'GET'的情況下知道新的表示。 –

+0

哦,對,這正是我想念的東西:)謝謝! – sp00m

相關問題