更快、更短、更即時是串流傳輸必要的元素, 而我們常常在使用Python請求API時都是等待式回應, 也就是一個請求過去之後, 待對方處理完畢後再行回應, 但假設需要下載的檔案、內容非常大時, 是不是使用者只能傻傻的等待整個傳輸結束後才能顯示? 這樣的使用者體驗也實在太糟糕了, 對於使用者來說除了完全狀況外之外, 也不知道到底有沒有在運作, 而你知道嗎? 其實http request的請求也有支援「流(stream)」式的傳輸, 它可以怎麼用呢?我們底下才會一一進行說明。
Python的requests裡面有get、post、put、delete…功能, 其中有一個stream參數, 想必平常也不太會去使用它吧! 除非我們今天拿著get去取一個超大(100GB)的檔案, 我們就會知道怎麼一直在等、等、等…, 那究竟有沒有辦法下載一點點就儲存一點點或者處理一點點呢? 答案是有的, stream這個關鍵參數就是個關鍵, 它可以讓我們一包包的下載檔案或者文本, 假如是文本的話就可以即時的顯示給使用者, 大幅度的提昇使用者體驗。
requests有post、get、put、delete…, 裡面都可以設定stream參數, 而得到的response則有「iter_content」、「iter_lines」兩個函式可以一部分的拉取資料, 我們可以看看底下的使用範例。
不過通常我們只會用get、post來設定stream=True。
response = requests.get(url, stream=True)
for chunk in response.iter_content(chunk_size=1024):
...對每個chunk進行處理
當我們進行請求時, 其實還沒有開始下載資料。
requests.get(xxx, stream=True)
而是呼叫了「iter_content」、「iter_lines」之後才會開始下載, 並且我們也可以決定一次要拉多少大小。
response = requests.get(xxx, stream=True)
for chunk in response.iter_content(chunk_size=1024):
xxx
今天介紹的requests套件是我們在python常常請求API會使用到的, 只是stream平常真的比較少用, 那為什麼我們會注意到這個部份呢? 主要是我們在「🔒 阿Han的軟體心法實戰營 - kafka專區」會大量的學習到串流技術, 那其中的ksql篇章就會使用http的stream來串流讀取流式資料, 因此我們先開了這篇章來說明一番, 日後當您接觸到kafak這類的串流技術時相信肯定能派上用場。