2014-12-23 47 views
1

我試圖定期請求服務器獲取數據。由於數據不會非常頻繁地變化,我決定添加If-None-Match標題來優化性能。問題是即使ETag保持不變,我仍然得到200狀態代碼而不是304。這是我寫的,以驗證它的一小腳本:即使在添加ETag標頭後仍未收到304響應

編輯

import requests 

headers = {'Accept':'application/json', 'Content-Type':'application/json', 'Authorization':'Bearer XXXX'} 
url = "https://api.producthunt.com/v1/posts/12330" 
req = None 
response_data = None 

for i in range(1,10): 

    if req: 
     headers = {'Accept':'application/json', 'Authorization':'Bearer XXXX', 'If-None-Match': req.headers['ETag']} 
     print req.request.headers.get('If-None-Match', 'Not set') # set 

    req = requests.get(url, headers = headers) 

    if response_data: 
     print sorted(req.json().items()) == sorted(response_data.items()) # always True 

    response_data = req.json() 

    print req.history # [] 
    print req.status_code # always 200 
  1. ETag頭是越來越設置。
  2. 返回的響應數據始終相同。
  3. 沒有重定向,因爲req.history總是返回一個空的列表。
  4. 我已經刪除了Content-Type標題,但回覆仍爲200
  5. 我使用的請求版本是2.5.0
+0

與我同樣的問題在這裏...你解決了這個問題嗎? – dofine

回答

0

因此,有一對夫婦的事情可能會發生:

  1. 你實際上可能沒有加入ETag頭。請求後,您應該檢查您是否使用req.request.headers.get('If-None-Match', 'Not set')。在第一次請求後,它永遠不會返回'Not set'

  2. 服務返回的表示可能正在改變。我最近幫助某人調試與GitHub API類似的東西(它們包括一個不同資源的簡短表示,該資源具有可能會改變和使ETag無效的屬性)。您應該檢查每次返回給您的數據是否完全相同。

  3. 檢查req.history,以確保沒有重定向,會可能導致問題

  4. 在一個GET請求沒有請求主體,你不應該指定一個Content-Type。沒有內容,所以不應該有內容類型。 (從技術上講,服務器不應該受到無謂的干擾,但服務器是善變的東西,沒有人知道他們會如何反應。)

超越了這一切,你能提供你請求的版本使用?

+0

ETag的返回是否始終完全相同,還是從請求變爲請求? –

+0

完全一樣。 –

+1

如果要求相隔幾個小時,它會發生變化。 –

相關問題