最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python接口自動化使用requests庫發(fā)送http請求

 更新時間:2022年08月08日 17:07:53   作者:測試框架師凃九  
這篇文章主要介紹了python接口自動化使用requests庫發(fā)送http請求,HTTP協(xié)議?,一個基于TCP/IP通信協(xié)議來傳遞數(shù)據(jù),包括html文件、圖像、結(jié)果等,即是一個客戶端和服務(wù)器端請求和應(yīng)答的標(biāo)準(zhǔn)

前言

今天筆者想和大家來聊聊python接口自動化如何使用requests庫發(fā)送http請求,廢話呢筆者就不多說了,直接進(jìn)入正題。

一、requests庫

什么是Requests ?Requests 是?Python語?編寫,基于urllib,采?Apache2 Licensed開源協(xié)議的 HTTP 庫。它? urllib 更加?便,可以節(jié)約我們?量的?作,完全滿?HTTP測試需求。

安裝:cmd命令行執(zhí)行pip install requests

二、HTTP 請求方法

HTTP 協(xié)議 (Hyper Text Transfer Protocol),一個基于TCP/IP通信協(xié)議來傳遞數(shù)據(jù),包括html文件、圖像、結(jié)果等,即是一個客戶端和服務(wù)器端請求和應(yīng)答的標(biāo)準(zhǔn)。根據(jù)HTTP 標(biāo)準(zhǔn),HTTP 請求可以使用多種請求方法。

  • HTTP 0.9:只有基本的文本GET請求,沒有固定的版本號,不支持請求頭。
  • HTTP 1.0:完善的請求/響應(yīng)模型,并將協(xié)議補(bǔ)充完整,定義了三種請求方法:GET,POST和HEAD方法。
  • HTTP 1.1:在1.0的基礎(chǔ)上進(jìn)行更新,新增了五種請求方法:OPTIONS,PUT,DELETE,TRACE和CONNECT方法。
  • HTTP 2.0(未普及):請求/響應(yīng)首部的定義基本沒有改變,只是所有首部鍵必須全部小寫,而且請求行要獨(dú)立為:method、:scheme、:host、:path這些鍵值

HTTP請求常用的Get和Post兩種方法:

  • GET是從服務(wù)器上獲取數(shù)據(jù),POST是向服務(wù)器傳送數(shù)據(jù)
  • GET請求參數(shù)都顯示在瀏覽器網(wǎng)址上,HTTP服務(wù)器根據(jù)該請求所包含URL中的參數(shù)來產(chǎn)生響應(yīng)內(nèi)容,也就是說GET請求的參數(shù)是URL的一部分。比如百度requests模塊
  • POST請求參數(shù)是在請求體當(dāng)中,消息長度沒有限制且以隱式的方式進(jìn)行傳送,通常用來向HTTP服務(wù)器提交量比較大的數(shù)據(jù)(比如請求中包含許多參數(shù)或者文件上傳操作等),請求的參數(shù)包含在“Content-Type”消息頭里,指明該消息體的媒體類型和編碼

三、發(fā)送GET請求

關(guān)鍵代碼:requests.get(url)

參數(shù)說明:若需要傳請求參數(shù),可直接在 url 后面添加,也可以在調(diào)用get()方法時通過關(guān)鍵字params傳入,需要注意的是params需要傳入dict(字典)類型。

下面以請求百度為例,發(fā)送get請求:

import requests
 
# 通過url直接加上請求參數(shù),與通過params傳參效果是一樣的
response = requests.get(url='http://www.baidu.com/s?wd=requests模塊')
# 通過params傳參
response2 = requests.get(url='http://www.baidu.com/s', params={"wd": "requests模塊"})
print(response.status_code)		# 打印狀態(tài)碼
# print(response.text)		# 獲取響應(yīng)內(nèi)容

? 運(yùn)行結(jié)果:

C:\software\python\python.exe D:/learn/test.py
200
 nished with exit code 0

四、發(fā)送POST請求

? 關(guān)鍵代碼:requests.post(url, data)

參數(shù)說明:可傳dict類型也可傳json類型,dict類型使用關(guān)鍵字data傳參,json類型則為使用關(guān)鍵字json傳參。若無需傳參可不傳。

register_url = "http://127.0.0.1:666/index/register"
 
# 添加請求頭,需要就傳
header = {
    "Content-Type": "application/json"
}
 
# json類型的參數(shù)
json = {
    "mobile_phone": "15612345678",
    "pwd": "Test1234",
    "type": 0
}
# 發(fā)送post請求
response = requests.post(url=register_url, json=json, headers=header)
print(response.json())
 
# 打印結(jié)果:{'code': 200, 'msg': 'success', 'password': '321', 'username': '123'}

?上面舉例為json類型的傳參,json和dict類型的數(shù)據(jù)結(jié)構(gòu)表面上看有點相似,那怎么判斷什么時候用json什么時候用dict呢?只要查看請求頭,需要哪種就傳哪種,表單類型的參數(shù),即"Content-Type: application/x-www-form-urlencoded"就使用關(guān)鍵字data去傳dcit類型的參數(shù),像上面舉例的"Content-Type": "application/json"json類型的參數(shù)一定要使用關(guān)鍵字json去傳遞。

五、獲取響應(yīng)數(shù)據(jù)

常見的屬性:

  • response.status_code:獲取響應(yīng)狀態(tài)碼
  • response.cookies:獲取
  • cookiesresponse.headers:獲取頭部信息
  • response.url:獲取
  • urlresponse.text:自動識別文本中的編碼格式進(jìn)行解碼,但有時候不準(zhǔn)確,會出現(xiàn)亂碼
  • response.content.decode('utf-8'):response.content,獲取字節(jié)流的數(shù)據(jù),進(jìn)行decode解碼,默認(rèn)是utf8
  • response.json():json方法可以將json字符串轉(zhuǎn)換成對應(yīng)的python類型的數(shù)據(jù),接口返回的數(shù)據(jù)99%都是json類型的
import requests
response = requests.get(url='http://www.baidu.com/s?wd=requests模塊')
# response = requests.get(url='http://www.baidu.com/s', params={"wd": "requests模塊"})
print("這是status_code:{}\n".format(response.status_code))
print("這是cookies:.{}\n".format(response.cookies))
print("這是headers:.{}\n".format(response.headers))
print("這是url:.{}\n".format(response.url))
# print("這是響應(yīng)頁面文本信息:.{}\n".format(response.text))   # 因為返回數(shù)據(jù)太長,不作運(yùn)行
# print("這是獲取的字節(jié)流數(shù)據(jù)decode解碼:.{}\n".format(response.content.decode()))

運(yùn)行結(jié)果:

C:\software\python\python.exe D:/learn/test.py
這是status_code:200
這是cookies:.<RequestsCookieJar[<Cookie BAIDUID=6EC84DD4DE623D1500B3D0E771D1D3FA:FG=1 for .baidu.com/>, <Cookie BIDUPSID=6EC84DD4DE623D15C087081CA8B7A6D9 for .baidu.com/>, <Cookie H_PS_PSSID=32292_1441_32355_32328_31253_32348_32046_32394_32429_32115_32437 for .baidu.com/>, <Cookie PSINO=6 for .baidu.com/>, <Cookie PSTM=1596554477 for .baidu.com/>, <Cookie delPer=0 for .baidu.com/>, <Cookie BDSVRTM=11 for www.baidu.com/>, <Cookie BD_CK_SAM=1 for www.baidu.com/>]>
這是headers:.{'Bdpagetype': '3', 'Bdqid': '0xf2cd9ccf00070e08', 'Cache-Control': 'private', 'Ckpacknum': '2', 'Ckrndstr': 'f00070e08', 'Connection': 'keep-alive', 'Content-Encoding': 'gzip', 'Content-Type': 'text/html;charset=utf-8', 'Date': 'Tue, 04 Aug 2020 15:21:17 GMT', 'P3p': 'CP=" OTI DSP COR IVA OUR IND COM ", CP=" OTI DSP COR IVA OUR IND COM "', 'Server': 'BWS/1.1', 'Set-Cookie': 'BAIDUID=6EC84DD4DE623D15C087081CA8B7A6D9:FG=1; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com, BIDUPSID=6EC84DD4DE623D15C087081CA8B7A6D9; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com, PSTM=1596554477; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com, BAIDUID=6EC84DD4DE623D1500B3D0E771D1D3FA:FG=1; max-age=31536000; expires=Wed, 04-Aug-21 15:21:17 GMT; domain=.baidu.com; path=/; version=1; comment=bd, delPer=0; path=/; domain=.baidu.com, BD_CK_SAM=1;path=/, PSINO=6; domain=.baidu.com; path=/, BDSVRTM=11; path=/, H_PS_PSSID=32292_1441_32355_32328_31253_32348_32046_32394_32429_32115_32437; path=/; domain=.baidu.com', 'Traceid': '1596554477018818305017495812540276870664', 'Vary': 'Accept-Encoding', 'X-Ua-Compatible': 'IE=Edge,chrome=1', 'Transfer-Encoding': 'chunked'}
這是url:.http://www.baidu.com/s?wd=requests%E6%A8%A1%E5%9D%97
Process finished with exit code 0

六、高級操作

在上面我們基本了解了requests庫的基本用法,如GET、POST請求以及response的屬性,接下來我們再看下requests庫的一些高級用法,如下載/上傳文件、Cookies設(shè)置、代理設(shè)置等。

6.1文件下載

與發(fā)送請求區(qū)別無二,只是保存時需要處理一下,如下載圖片,把獲取圖片的二進(jìn)制數(shù)據(jù)然后用二進(jìn)制寫入文件即可。

import requests
 
response = requests.get('https://github.com/favicon.ico')
 
# 獲取二進(jìn)制數(shù)據(jù),然后寫入文件
with open('favicon.ico','wb')as f:
    f.write(response.content)
    f.close

6.2文件上傳

? 關(guān)鍵代碼:requests.post(utl, files=files)

import requests
 
file = {'file':open('favicon.ico','rb')}	# 將之前抓取的github圖標(biāo)以二進(jìn)制格式讀取
response = requests.post('http://httpbin.org/post', files = file)
print(response.text)

6.3SSL證書驗證

為什么會有SSL證書驗證,SSL是什么?

SSL協(xié)議是網(wǎng)絡(luò)層和傳輸層的協(xié)議。SSL(Secure Sockets Layer 安全套接層)協(xié)議,及其繼任者TLS(Transport Layer Security傳輸層安全)協(xié)議,是為網(wǎng)絡(luò)通信提供安全及數(shù)據(jù)完整性的一種安全協(xié)議。

? HTTPS是兼容HTTP的,可以把HTTPS理解為'HTTP over TSL',即HTTPS是HTTP協(xié)議和TSL協(xié)議的組合。HTTPS在傳輸數(shù)據(jù)時,同樣會先建立TCP連接,建立起TCP連接后,會建立TSL連接。請求可以為HTTPS請求驗證SSL證書,就像我們使用的瀏覽器一樣,SSL驗證默認(rèn)是開啟的,如果證書驗證失敗,請求會拋出一個SSLError,如下圖:

碰到請求SSL驗證的,我們是可以直接跳過不驗證的,通過設(shè)置verify=False就可關(guān)閉錯誤提示,跳過SSL驗證,這里只是忽略了SSL驗證,并不是沒有了SSL驗證,它仍然會存在一個警告信息InsecureRequestWarning。

import requests
#通過一下兩行代碼即可把警報消除,即使verify=False,報警還是存在的
from requests.packages import urllib3
urllib3.disable_warnings()
response = requests.get('https://www.12306.cn',verify = False)
print(response.status_code)

6.4保持會話

?在requests中,如果直接使用get()或post()等方法是可以做到模擬網(wǎng)頁的接口請求,但是每次發(fā)起請求結(jié)束后它就結(jié)束了,并不會保存相關(guān)的驗證信息,如cookies/token;比如第一次使用post()請求登錄了某個網(wǎng)站,第二次想獲取成功登錄后的用戶個人信息,再一次發(fā)起post()請求時它會要求你需求先登錄,明明第一次請求時已經(jīng)登錄了,為什么第二次還提示要先登錄呢?實際上兩次請求相當(dāng)于使用了兩個瀏覽器去訪問,是兩個完全不相關(guān)的會話,因此第二次請求是拿不到用戶信息的。

requests中的session對象能夠讓我們跨http請求保持某些參數(shù),即讓同一個session對象發(fā)送的請求頭攜帶某個指定的參數(shù)。當(dāng)然,最常見的應(yīng)用是它可以讓cookie保持在后續(xù)的一串請求中。

# 創(chuàng)建一個session對象,使它能夠自動記錄上一次請求中的cookie信息
se = requests.session()
 
# 登錄接口
login_url = "http://www.test.com/api/member/login"
login_data = {
    "mobilephone": "15612355678",
    "pwd": "Test1234"
}
res = se.post(url=login_url, data=login_data)
 
# 登錄后查詢用戶最近的訂單記錄
order_record_url = "http://www.test.com/api/member/order"
record_data = {
    "beginTime": "2022-07-01",
    "endTime": "2022-07-10"
}
res2 = se.post(url=order_record_url, data=record_data)
print(res2.json())

6.5requests封裝

凡是需要重復(fù)使用的,我們都可以對它進(jìn)行二次封裝,寫成我們自己的版本,還可以在封裝過程中加入我們想要的內(nèi)容,使用的時候直接調(diào)用即可。

import requests
class SendSessionRequest:
    """使用session鑒權(quán)的接口,記錄cookies/token"""
    def __init__(self):
        self.session = requests.session()
 
    def requests(self, url, method, params=None, data=None, json=None, headers=None):
        method = method.lower()
        if method == "post":
            return self.session.post(url=url, json=json, data=data, headers=headers)
        elif method == "patch":
            return self.session.patch(url=url, json=json, data=data, headers=headers)
        elif method == "get":
            return self.session.get(url=url, params=params)

總結(jié)

到此這篇關(guān)于python接口自動化使用requests庫發(fā)送http請求的文章就介紹到這了,更多相關(guān)python 發(fā)送http請求內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • python如何寫個俄羅斯方塊

    python如何寫個俄羅斯方塊

    這篇文章主要介紹了python寫個俄羅斯方塊,幫助大家更好的理解和使用python,感興趣的朋友可以了解下
    2020-11-11
  • python實現(xiàn)凱撒密碼加密解密的示例代碼

    python實現(xiàn)凱撒密碼加密解密的示例代碼

    本文主要介紹了python實現(xiàn)凱撒密碼加密解密的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • 使用wxPython和pandas模塊生成Excel文件的代碼實現(xiàn)

    使用wxPython和pandas模塊生成Excel文件的代碼實現(xiàn)

    在Python編程中,有時我們需要根據(jù)特定的數(shù)據(jù)生成Excel文件,本文將介紹如何使用wxPython和pandas模塊來實現(xiàn)這個目標(biāo),文中通過代碼示例給大家講解的非常詳細(xì),具有一定的參考價值,需要的朋友可以參考下
    2024-05-05
  • python3+selenium4實現(xiàn)切換窗口與iframe的方法

    python3+selenium4實現(xiàn)切換窗口與iframe的方法

    在自動化測試過程中,有時后會遇到元素定位方式?jīng)]有問題,但是依舊拋出無法找到元素的異常的問題,有可能是由于當(dāng)前焦點不在指定頁面或iframe導(dǎo)致的,本文就來說明 一下
    2021-05-05
  • Python使用asyncio包處理并發(fā)的實現(xiàn)代碼

    Python使用asyncio包處理并發(fā)的實現(xiàn)代碼

    這篇文章主要介紹了Python使用asyncio包處理并發(fā),asyncio包使用事件循環(huán)驅(qū)動的協(xié)程實現(xiàn)并發(fā),本文通過實例代碼給大家介紹的非常詳細(xì)對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-12-12
  • Python pandas 重命名索引和列名稱的實現(xiàn)

    Python pandas 重命名索引和列名稱的實現(xiàn)

    本文主要介紹了Python pandas 重命名索引和列名稱的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • Python字符串不可不知的6個小技巧分享

    Python字符串不可不知的6個小技巧分享

    字符串可以理解為一段普通的文本內(nèi)容,在python里,使用引號來表示一個字符串,不同的引號表示的效果會有區(qū)別,本文將給介紹Python字符串不可不知的6個小技巧分享,并有詳細(xì)的代碼供大家參考,感興趣的小伙伴可以參考一下
    2024-03-03
  • python判斷列表為空的三種方法總結(jié)

    python判斷列表為空的三種方法總結(jié)

    這篇文章主要介紹了python判斷列表為空的三種方法總結(jié),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • python獲取Pandas列名的幾種方法

    python獲取Pandas列名的幾種方法

    這篇文章主要介紹了python獲取Pandas列名的幾種方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • django 控制頁面跳轉(zhuǎn)的例子

    django 控制頁面跳轉(zhuǎn)的例子

    今天小編就為大家分享一篇django 控制頁面跳轉(zhuǎn)的例子,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-08-08

最新評論

贺兰县| 丹江口市| 林甸县| 岑巩县| 西丰县| 当涂县| 谷城县| 景德镇市| 平度市| 邹平县| 霍邱县| 海门市| 明水县| 高尔夫| 饶阳县| 开远市| 泸定县| 长兴县| 温宿县| 伊川县| 江城| 永德县| 越西县| 屏南县| 正镶白旗| 察雅县| 昌图县| 龙游县| 山东省| 九台市| 台山市| 通州区| 新泰市| 淮北市| 江永县| 高邑县| 临颍县| 台江县| 沂水县| 彭州市| 乌海市|