一開始就直指Requests的核心:Make a Request
,竟然只要一行程式碼就可以得到一個Response物件,展示了簡單易用的特性,光是第一段就非常吸引人繼續往下閱讀。
第二段在講如何產生問號後面的URL query string
,兩行解決,並且提示Response物件有一個屬性url
,展示了經由Requests後產生的url長相。
第三段慢慢地揭開Response物件的面紗,提到Requests會針對伺服器所回傳的內容進行自動解碼(automatically decode),且會猜測回傳內容的編碼是什麼,根據Day10-Models-Response,其實就是借用了chardet
這個套件的力量。提示Response物件有第二個屬性encoding
,向使用者說明有機會對該內容的值做修改,結果會影響到第三個屬性text
的內容。
...
...
# Fallback to auto-detected encoding.
if self.encoding is None:
encoding = self.apparent_encoding
# Forcefully remove BOM from UTF-8
elif self.encoding.lower() == 'utf-8':
encoding = 'utf-8-sig'
...
...
@property
def apparent_encoding(self):
"""The apparent encoding, provided by the chardet library."""
return chardet.detect(self.content)['encoding']
Requests will automatically decode content from the server.
Requests makeseducated guesses
about the encoding of the response based on the HTTP headers. The text encoding guessed by Requests is used when you accessr.text
.
講完了編碼之後,第四到第六段針對伺服器回傳的內容分類,分為Binary
, JSON
, Raw
。
說明JSON的時候額外提到若需要判斷該次回傳是否成功,需要透過status_code
或是raise_for_status()
決定成功與否。
針對處理streaming的資料,提供了一個易用的模式給使用者。使用iter_content,用到了yield
和generator
的觀念
gzip
and deflate
transfer-encodings are automatically decoded for you.
stream=True
in your initial requestr = requests.get('https://api.github.com/events', stream=True)
with open(filename, 'wb') as fd:
for chunk in r.iter_content(chunk_size=128):
fd.write(chunk)
整理一下到目前為止提到的幾個屬性和方法
r = requests.get('https://api.github.com/events', stream=True)
r.url
r.encoding
r.text
r.status_code
r.raise_for_status()
r.content
r.json()
r.raw
r.iter_content()