[HTTP] HTTP 中的超時時間

1. Connection Timeout

對於一般的 HTTP 請求 API 來說,這個 Connection Timeout 代表客戶端最大的等待時長,如果超過了這個時間,那麼就會拋出異常,不會再繼續等待下去。因爲有的請求的 API 是阻塞式的(例如 Python 的 Requests 庫),需要終止等待,繼續其他工作。有時候 Connection Timeout 代表的是客戶端的整個等待時間,有時候也會分的細緻一些,這個要看上下文,會分成三個部分:

  • Connection Timeout:客戶端和服務器建立連接的時間,因爲 HTTP 底層基於 TCP,因此會有一個連接建立的過程,如果超過這個時間,那麼應該會出現這個 Timeout;
  • Write Timeout:客戶端發送數據的時間,例如客戶端要發送一個文件到服務器上,客戶端不停的發送數據,如果超過這個時間,就會出現 Write Timeout,不過這個不常用,一般 API 裏也沒有設定這個值的接口;
  • Read Timeout:客戶端等待服務器響應的時間,這個比較常見,例如服務器需要處理複雜的業務,處理時間過長,超過這個時間,那麼客戶端會出現 Read Timeout。

可以用 Python 簡單試一下:

先構造一個服務器,接收 get 請求,收到請求後,掛起 10s,然後再響應;

from http.server import BaseHTTPRequestHandler, HTTPServer
from time import sleep

class handler(BaseHTTPRequestHandler):
    def do_GET(self):
        self.send_response(200)
        sleep(10)
        self.send_header('Content-type','text/html')
        self.end_headers()

        message = "Hello, World!"
        self.wfile.write(bytes(message, "utf8"))

with HTTPServer(('', 8000), handler) as server:
    server.serve_forever()

然後發起請求

import requests as re
# timeout 如果不是元組,是一個數值的話,代表客戶端的等待時間
# 或者 (connection timeout, read timeout)
resp = re.get("http://127.0.0.1:8000", timeout=(1,3))
print(resp.text)

不出意外,收到了 read timeout,客戶端超過 3s 沒有收到服務器的迴應,拋出了異常。如果我們把 read timeout 從 3 調整到 11,客戶端就可以順利收到消息。

requests.exceptions.ReadTimeout: HTTPConnectionPool(host='127.0.0.1', port=8000): Read timed out. (read timeout=3)

2. Request Timeout 408

這個一般是說,服務器等待太久沒有收到來自客戶端的消息,從而關閉了連接,防止服務器資源被空閒的連接所浪費。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章