傳遞參數
傳遞URL參數
data = {'city': '北京'} # 參數有中文如果發送不了,必須要編碼 city = parse.urlencode(data).encode('utf-8')
一般在GET請求中使用查詢字符串(query string)來進行參數傳遞,在requests庫中使用如下方法:
import requests base_url = 'http://httpbin.org' # 將參數存在字典里 params_data = {"user": "zou", "pwd": '31500'} r = requests.get(base_url + '/get', params=params_data) print(r.url) # 打印URL print(r.status_code)
結果
http://httpbin.org/get?user=zou&pwd=31500 200
傳遞body參數
在post請求里有兩個參數,data為form表單格式的,json為Content-Type是json格式的。返回的值如果是json格式的,可以用r.json(),r.text不管是json格式還是html格式的都可以
在POST請求中,一般參數都在請求體中傳遞,在requests中用法如下:
import requests base_url = 'http://httpbin.org' # 將參數存在字典里 form_data = {"user": "zou", "pwd": '31500'} r = requests.post(base_url + '/post', data=form_data) print(r.url) # 打印URL print(r.status_code) print(r.text) # 打印出響應文本
結果:
http://httpbin.org/post 200 { "args": {}, "data": "", "files": {}, "form": { "pwd": "31500", "user": "zou" }, "headers": { "Accept": "*/*", "Accept-Encoding": "gzip, deflate", "Content-Length": "18", "Content-Type": "application/x-www-form-urlencoded", "Host": "httpbin.org", "User-Agent": "python-requests/2.18.4" }, "json": null, "origin": "112.10.81.210, 112.10.81.210", "url": "https://httpbin.org/post" }
data和json的區別
如果我們發送post請求時,里面有個參數json,還有個參數時data,它們都是提交的服務器的數據,那它們有什么區別呢?
data與json既可以是str,也可以是dict
區別如下:
不管json是str還是dict,如果不指定headers中的content-type,默認為application/json
data為dict時,如果不指定content-type,默認為application/x-www-form-urlencoded,相當於普通form表單提交的形式,此時數據可以從request.POST里面獲取,而request.body的內容則為a=1&b=2的這種形式,注意,即使指定content-type=application/json,request.body的值也是類似於a=1&b=2,所以並不能用json.loads(request.body.decode())得到想要的值
data為str時,如果不指定content-type,默認為application/json
原始響應內容
可以找出 Requests 使用了什么編碼,並且能夠使用r.encoding 屬性來改變它:
r.encoding # 獲取編碼格式 'utf-8'
r.encoding = 'ISO-8859-1' # 設置編碼格式
在罕見的情況下,你可能想獲取來自服務器的原始套接字響應,那么你可以訪問 r.raw。 如果你確實想這么干,那請你確保在初始請求中設置了 stream=True。具體你可以這么做:
>>> r = requests.get('https://api.github.com/events', stream=True) >>> r.raw <requests.packages.urllib3.response.HTTPResponse object at 0x101194810>
>>> r.raw.read(10) '\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\x03'
如果發送了一個錯誤請求(一個 4XX 客戶端錯誤,或者 5XX 服務器錯誤響應),我們可以通過Response.raise_for_status() 來拋出異常:
>>> bad_r = requests.get('http://httpbin.org/status/404') >>> bad_r.status_code 404 >>> bad_r.raise_for_status() Traceback (most recent call last): File "requests/models.py", line 832, in raise_for_status raise http_error requests.exceptions.HTTPError: 404 Client Error