最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊

關(guān)于接口測試的“神仙級工具”,今天來說一下關(guān)于requests的那些事

2020-11-06 20:12 作者:軟件測試檸檬班Pro  | 我要投稿

簡介?

使用 python 做自動(dòng)化接口測試需要用代碼發(fā)送 http 請求。requests 是 Python 語言里網(wǎng)絡(luò)請求庫中最好用的,沒有之一,今天我們就來好好講講關(guān)于requests如何讓接口測試變簡單的。

requests 庫有完善詳盡的中文版官方文檔:https://requests.readthedocs.io/zh_CN/latest/


作者?

Requests?的作者?Kenneth Reitz?是一個(gè)富有傳奇色彩的人物。Kenneth Reitz?在有著“云服務(wù)鼻祖”之稱的 Heroku 公司,28 歲時(shí)就擔(dān)任了 Python 語言的總架構(gòu)師。

以上圖片來自Kenneth Reitz的個(gè)人主頁

他做了什么呢?隨便列幾個(gè)項(xiàng)目名稱:requests、python-guide、pipenv、legit、autoenv,當(dāng)然它也給 Python 界很多知名的開源項(xiàng)目貢獻(xiàn)了代碼,比如 Flask。大神級程序員,據(jù)說其身價(jià)高達(dá) 5 億美元。


使用


話不多說,我們來看一下具體的詳細(xì)操作吧。


1、發(fā)起請求

【1】 請求方法


每一個(gè)請求方法都有一個(gè)對應(yīng)的 API,比如 GET 請求就可以使用?get()方法:


import requestsresp = requests.get('https://www.baidu.com')
而 POST 請求就可以使用?post()?方法,并且將需要提交的數(shù)據(jù)傳遞給 data 參數(shù)即可:


resp = requests.post('http://httpbin.org/post',data = {'key':'value'})
而其他的請求類型,都有各自對應(yīng)的方法:


requests.put('http://httpbin.org/put', data = {'key':'value'})requests.delete('http://httpbin.org/delete')requests.head('http://httpbin.org/get')requests.options('http://httpbin.org/get')


非常的簡單直觀明了。

【2】傳遞 URL 參數(shù)


傳遞 URL 參數(shù)不需要去拼接 URL,而是簡單的,構(gòu)造一個(gè)字典,并在請求時(shí)將其傳遞給 params 參數(shù):


import requestsparams = {'key1': 'value1', 'key2': 'value2'}resp = requests.get("http://httpbin.org/get", params=params)
此時(shí),查看請求的 URL,則可以看到 URL 已經(jīng)構(gòu)造正確


print(resp.url)
http://httpbin.org/get?key1=value1&key2=value2

并且,有時(shí)候我們會(huì)遇到相同的 url 參數(shù)名,但有不同的值,而 python 的字典又不支持鍵的重名,那么我們可以把鍵的值用列表表示:



params = {'key1': 'value1', 'key2': ['value2', 'value3']}
resp = requests.get('http://httpbin.org/get', params=params)
print(resp.url)


http://httpbin.org/get?key1=value1&key2=value2&key2=value3

:http://httpbin.org?是 Kenneth Reitz 搭建的為測試 http 服務(wù)而寫的項(xiàng)目。


【3】傳遞表單參數(shù)


通常,你想要發(fā)送一些編碼為表單形式的數(shù)據(jù)——非常像一個(gè) HTML 表單。


要實(shí)現(xiàn)這個(gè),只需簡單地傳遞一個(gè)字典給 data 參數(shù)。你的數(shù)據(jù)字典在發(fā)出請求時(shí)會(huì)自動(dòng)編碼為表單形式:
resp = requests.post('http://httpbin.org/post', data = {'key':'value'})resp.json()
{'args': {},'data': '','files': {},'form': {'key': 'value'},'headers': {'Accept': '/','Accept-Encoding': 'gzip, deflate','Content-Length': '9','Content-Type': 'application/x-www-form-urlencoded','Host': 'httpbin.org','User-Agent': 'python-requests/2.23.0','X-Amzn-Trace-Id': 'Root=1-5f620401-c24c466c4e6fac3ee0fda64d'},'json': None,'origin': '113.246.106.31','url': 'http://httpbin.org/post'}


【4】傳遞 JSON 參數(shù)


使用?json?參數(shù)直接傳遞,然后它就會(huì)被自動(dòng)編碼。這是 2.4.2 版的新加功能:
resp = requests.post('http://httpbin.org/post', json = {'key':'value'})resp.json()
{'args': {},'data': '{"key": "value"}','files': {},'form': {},'headers': {'Accept': '/','Accept-Encoding': 'gzip, deflate','Content-Length': '16','Content-Type': 'application/json','Host': 'httpbin.org','User-Agent': 'python-requests/2.23.0','X-Amzn-Trace-Id': 'Root=1-5f620443-9d8785d6ee6f444a67a162f8'},'json': {'key': 'value'},'origin': '113.246.106.31','url': 'http://httpbin.org/post'}


【5】上傳文件


使用?files?參數(shù)傳遞文件句柄
url = 'http://httpbin.org/post'files = {'file':?open('test.xls', 'rb')}r = requests.post(url, files=files)r.text


【6】自定義 Headers


如果想自定義請求的 Headers,同樣的將字典數(shù)據(jù)傳遞給 headers 參數(shù)。
url = 'http://httpbin.org/get'headers = {'user-agent': 'lemonban/0.0.1'}resp = requests.get(url, headers=headers)resp.json()
{'args': {},'headers': {'Accept': '/','Accept-Encoding': 'gzip, deflate','Host': 'httpbin.org','User-Agent': 'lemonban/0.0.1','X-Amzn-Trace-Id': 'Root=1-5f6205a1-25641a90501e5911352a84c0'},'origin': '113.246.106.31','url': 'http://httpbin.org/get'}


【7】自定義 Cookies


Requests?中自定義 Cookies 也不用再去構(gòu)造 CookieJar 對象,直接將字典遞給 cookies 參數(shù)。


url = 'http://httpbin.org/get'cookies = {'cookies_are': 'working'}resp = requests.get(url, cookies=cookies)resp.json()
{'args': {},'headers': {'Accept': '/','Accept-Encoding': 'gzip, deflate','Cookie': 'cookies_are=working','Host': 'httpbin.org','User-Agent': 'python-requests/2.23.0','X-Amzn-Trace-Id': 'Root=1-5f6205d9-03efd00833b145237185ded0'},'origin': '113.246.106.31','url': 'http://httpbin.org/get'}


【8】設(shè)置代理


當(dāng)我們需要使用代理時(shí),同樣構(gòu)造代理字典,傳遞給 proxies 參數(shù)。
proxies = { ?'http': 'http://10.10.1.10:3128', ?'https':'http://10.10.1.10:1080',}requests.get('http://example.org', proxies=proxies)


【9】重定向


在網(wǎng)絡(luò)請求中,我們常常會(huì)遇到狀態(tài)碼是 3 開頭的重定向問題,在 Requests 中是默認(rèn)開啟允許重定向的,即遇到重定向時(shí),會(huì)自動(dòng)繼續(xù)訪問
resp = requests.get('http://github.com', allow_redirects=False)resp.status_code


【10】禁止證書驗(yàn)證


有時(shí)候我們使用了抓包工具,這個(gè)時(shí)候由于抓包工具提供的證書并不是由受信任的數(shù)字證書頒發(fā)機(jī)構(gòu)頒發(fā)的,所以證書的驗(yàn)證會(huì)失敗,所以我們就需要關(guān)閉證書驗(yàn)證。
在請求的時(shí)候把?verify?參數(shù)設(shè)置為?False?就可以關(guān)閉證書驗(yàn)證了。
import?requestsresp = requests.get('https://httpbin.org/get', verify=False)
但是關(guān)閉驗(yàn)證后,會(huì)有一個(gè)比較煩人的 warning,可以使用以下方法關(guān)閉警告:
from?requests.packages.urllib3.exceptions?importInsecureRequestWarning

# 禁用安全請求警告requests.packages.urllib3.disable_warnings(InsecureRequestWarning)


【11】設(shè)置超時(shí)


設(shè)置訪問超時(shí),設(shè)置 timeout 參數(shù)即可。
requests.get('http://github.com', timeout=0.001)
可見,通過 Requests 發(fā)起請求,只需要構(gòu)造好幾個(gè)需要的字典,并將其傳入請求的方法中,即可完成基本的網(wǎng)絡(luò)請求。


2、響應(yīng)

通過 Requests 發(fā)起請求獲取到的,是一個(gè) requests.models.Response 對象。通過這個(gè)對象我們可以很方便的獲取響應(yīng)的內(nèi)容。


【1】響應(yīng)數(shù)據(jù)


通過 Response 對象的 text 屬性可以獲得字符串格式的響應(yīng)內(nèi)容。
import?requestsresp = requests.get('https://www.baidu.com')resp.text
Requests?會(huì)自動(dòng)的根據(jù)響應(yīng)的報(bào)頭來猜測網(wǎng)頁的編碼是什么,然后根據(jù)猜測的編碼來解碼網(wǎng)頁內(nèi)容,基本上大部分的網(wǎng)頁都能夠正確的被解碼。而如果發(fā)現(xiàn)?text?解碼不正確的時(shí)候,就需要我們自己手動(dòng)的去指定解碼的編碼格式。


import?requests

resp = requests.get('https://www.baidu.com')resp.encoding = 'utf-8' ? # 設(shè)置編碼resp.text
而如果你需要獲得原始的二進(jìn)制數(shù)據(jù),那么使用?content?屬性即可。
resp.content
如果我們訪問之后獲得的數(shù)據(jù)是 JSON 格式的,那么我們可以使用?json()?方法,直接獲取轉(zhuǎn)換成字典格式的數(shù)據(jù)。
resp = requests.get('http://httpbin.org/get')resp.json()
{'args': {},'headers': {'Accept': '/','Accept-Encoding': 'gzip, deflate','Host': 'httpbin.org','User-Agent': 'python-requests/2.23.0','X-Amzn-Trace-Id': 'Root=1-5f62083f-6b0db04c94aff004d15c0068'},'origin': '113.246.106.31','url': 'http://httpbin.org/get'}


【2】狀態(tài)碼


通過?status_code?屬性獲取響應(yīng)的狀態(tài)碼
resp = requests.get('http://httpbin.org/get')resp.status_code


【3】響應(yīng)報(bào)頭


通過?headers?屬性獲取響應(yīng)的報(bào)頭
resp.headers
{'Date': 'Wed, 16 Sep 2020 12:43:17 GMT', 'Content-Type': 'application/json', 'Content-Length': '307', 'Connection': 'keep-alive', 'Server': 'gunicorn/19.9.0', 'Access-Control-Allow-Origin': '*', 'Access-Control-Allow-Credentials': 'true'}


【4】服務(wù)器返回的 cookies


通過?cookies?屬性獲取服務(wù)器返回的?cookies
import?requestsurl = 'http://www.baidu.com'resp = requests.get(url)resp.cookies
<RequestsCookieJar[Cookie(version=0, name='BDORZ', value='27315', port=None, port_specified=False, domain='.baidu.com', domain_specified=True, domain_initial_dot=True, path='/', path_specified=True, secure=False, expires=1600346744, discard=False, comment=None, comment_url=None, rest={}, rfc2109=False)]>


【5】url


還可以使用 url 屬性查看訪問的 url。
params = {'key1': 'value1', 'key2': 'value2'}resp = requests.get("http://httpbin.org/get", params=params)resp.url
'http://httpbin.org/get?key1=value1&key2=value2'


3、Session


在 Requests 中,實(shí)現(xiàn)了 Session(會(huì)話) 功能,當(dāng)我們使用 Session 時(shí),能夠像瀏覽器一樣,在沒有關(guān)閉關(guān)閉瀏覽器時(shí),能夠保持住訪問的狀態(tài)。

這個(gè)功能常常被我們用于登陸之后的數(shù)據(jù)獲取,使我們不用再一次又一次的傳遞 cookies。

  • import requests

    session = requests.Session()

    session.get('http://httpbin.org/cookies/set/sessioncookie/123456789')

    resp = session.get('http://httpbin.org/cookies')

    print(resp.text)



    {
    "cookies": {
    "sessioncookie": "123456789"
    }
    }

首先我們需要去生成一個(gè)?Session?對象,然后用這個(gè)?Session?對象來發(fā)起訪問,發(fā)起訪問的方法與正常的請求是一摸一樣的。

同時(shí),需要注意的是,如果是我們在?get()?方法中傳入?headers?和?cookies?等數(shù)據(jù),那么這些數(shù)據(jù)只在當(dāng)前這一次請求中有效。

如果你想要讓一個(gè) headers 在 Session 的整個(gè)生命周期內(nèi)都有效的話,需要用以下的方式來進(jìn)行設(shè)置:

# 設(shè)置整個(gè)headers ? ? ?session.headers ={ ? ? ? ? 'user-agent': 'lemonban/0.0.1' }# 增加一條headers ? ? ?session.headers.update({'x-test': 'true'})

今天大家“學(xué)廢”了嗎?要是有疑惑的,歡迎評論區(qū)留言,心藍(lán)老師會(huì)為大家解答的啦~

聲明:本文為檸檬班心藍(lán)老師原創(chuàng),轉(zhuǎn)載請注明出處!

關(guān)于接口測試的“神仙級工具”,今天來說一下關(guān)于requests的那些事的評論 (共 條)

分享到微博請遵守國家法律
阳城县| 隆尧县| 嘉义县| 平阴县| 中宁县| 称多县| 汕头市| 泽库县| 耿马| 顺昌县| 吉林省| 湖州市| 湖口县| 湖南省| 偃师市| 沂源县| 定兴县| 会同县| 沈阳市| 天长市| 泰宁县| 濉溪县| 连江县| 隆尧县| 温宿县| 和龙市| 无为县| 沧州市| 郑州市| 汕头市| 杭州市| 田林县| 岗巴县| 安乡县| 左贡县| 腾冲县| 谢通门县| 房山区| 手游| 高安市| 东阳市|