Python接口自動化之使用requests庫發送http請求

requests庫

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

? 安裝:cmd命令行執行pip install requests

HTTP 請求方法

? HTTP 協議 (Hyper Text Transfer Protocol),一個基于TCP/IP通信協議來傳遞數據,包括html文件、圖像、結果等,即是一個客戶端和服務器端請求和應答的標準。根據HTTP 標準,HTTP 請求可以使用多種請求方法。

HTTP 0.9:只有基本的文本GET請求,沒有固定的版本號,不支持請求頭。
HTTP 1.0:完善的請求/響應模型,并將協議補充完整,定義了三種請求方法:GET,POST和HEAD方法。
HTTP 1.1:在1.0的基礎上進行更新,新增了五種請求方法:OPTIONS,PUT,DELETE,TRACE和CONNECT方法。
HTTP 2.0(未普及):請求/響應首部的定義基本沒有改變,只是所有首部鍵必須全部小寫,而且請求行要獨立

為:method、:scheme、:host、:path這些鍵值對。
在這里插入圖片描述

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

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

發送GET請求

? 關鍵代碼:requests.get(url)

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

? 下面以請求百度為例,發送get請求:

  1. import requests

  2. # 通過url直接加上請求參數,與通過params傳參效果是一樣的

  3. response = requests.get(url='http://www.baidu.com/s?wd=requests模塊')

  4. # 通過params傳參

  5. response2 = requests.get(url='http://www.baidu.com/s', params={"wd": "requests模塊"})

  6. print(response.status_code) # 打印狀態碼

  7. # print(response.text) # 獲取響應內容

運行結果:

  1. C:\software\python\python.exe D:/learn/test.py

  2. 200

  3. Process finished with exit code 0

?發送POST請求

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

? 參數說明:可傳dict類型也可傳json類型,dict類型使用關鍵字data傳參,json類型則為使用關鍵字json傳參。若無需傳參可不傳。

  1. register_url = "http://127.0.0.1:666/index/register"

  2. # 添加請求頭,需要就傳

  3. header = {

  4. "Content-Type": "application/json"

  5. }

  6. # json類型的參數

  7. json = {

  8. "mobile_phone": "15612345678",

  9. "pwd": "Test1234",

  10. "type": 0

  11. }

  12. # 發送post請求

  13. response = requests.post(url=register_url, json=json, headers=header)

  14. print(response.json())

  15. # 打印結果:{'code': 200, 'msg': 'success', 'password': '321', 'username': '123'}

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

獲取響應數據

? 常見的屬性:

response.status_code:獲取響應狀態碼
response.cookies:獲取cookies
response.headers:獲取頭部信息
response.url:獲取url
response.text:自動識別文本中的編碼格式進行解碼,但有時候不準確,會出現亂碼
response.content.decode(‘utf-8’):response.content,獲取字節流的數據,進行decode解碼,默認是utf8
response.json():json方法可以將json字符串轉換成對應的python類型的數據,接口返回的數據99%都是json類型的

  1. import requests

  2. response = requests.get(url='http://www.baidu.com/s?wd=requests模塊')

  3. # response = requests.get(url='http://www.baidu.com/s', params={"wd": "requests模塊"})

  4. print("這是status_code:{}\n".format(response.status_code))

  5. print("這是cookies:.{}\n".format(response.cookies))

  6. print("這是headers:.{}\n".format(response.headers))

  7. print("這是url:.{}\n".format(response.url))

  8. # print("這是響應頁面文本信息:.{}\n".format(response.text)) # 因為返回數據太長,不作運行

  9. # print("這是獲取的字節流數據decode解碼:.{}\n".format(response.content.decode()))

運行結果:

  1. C:\software\python\python.exe D:/learn/test.py

  2. 這是status_code:200

  3. 這是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/>]>

  4. 這是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'}

  5. 這是url:.http://www.baidu.com/s?wd=requests%E6%A8%A1%E5%9D%97

  6. Process finished with exit code 0

高級操作

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

文件下載

? 與發送請求區別無二,只是保存時需要處理一下,如下載圖片,把獲取圖片的二進制數據然后用二進制寫入文件即可。

  1. import requests

  2. response = requests.get('https://github.com/favicon.ico')

  3. # 獲取二進制數據,然后寫入文件

  4. with open('favicon.ico','wb')as f:

  5. f.write(response.content)

  6. f.close

文件上傳

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

  1. import requests

  2. file = {'file':open('favicon.ico','rb')} # 將之前抓取的github圖標以二進制格式讀取

  3. response = requests.post('http://httpbin.org/post', files = file)

  4. print(response.text)

SSL證書驗證

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

? SSL協議是網絡層和傳輸層的協議。SSL(Secure Sockets Layer 安全套接層)協議,及其繼任者TLS(Transport Layer Security傳輸層安全)協議,是為網絡通信提供安全及數據完整性的一種安全協議。

? HTTPS是兼容HTTP的,可以把HTTPS理解為’HTTP over TSL’,即HTTPS是HTTP協議和TSL協議的組合。HTTPS在傳輸數據時,同樣會先建立TCP連接,建立起TCP連接后,會建立TSL連接。請求可以為HTTPS請求驗證SSL證書,就像我們使用的瀏覽器一樣,SSL驗證默認是開啟的,如果證書驗證失敗,請求會拋出一個SSLError,如下圖:
在這里插入圖片描述

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

  1. import requests

  2. #通過一下兩行代碼即可把警報消除,即使verify=False,報警還是存在的

  3. from requests.packages import urllib3

  4. urllib3.disable_warnings()

  5. response = requests.get('https://www.12306.cn',verify = False)

  6. print(response.status_code)

保持會話

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

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

  1. # 創建一個session對象,使它能夠自動記錄上一次請求中的cookie信息

  2. se = requests.session()

  3. # 登錄接口

  4. login_url = "http://www.test.com/api/member/login"

  5. login_data = {

  6. "mobilephone": "15612345678",

  7. "pwd": "Test1234"

  8. }

  9. res = se.post(url=login_url, data=login_data)

  10. # 登錄后查詢用戶最近的訂單記錄

  11. order_record_url = "http://www.test.com/api/member/order"

  12. record_data = {

  13. "beginTime": "2020-08-01",

  14. "endTime": "2020-08-15"

  15. }

  16. res2 = se.post(url=order_record_url, data=record_data)

  17. print(res2.json())

requests封裝

? 凡是需要重復使用的,我們都可以對它進行二次封裝,寫成我們自己的版本,還可以在封裝過程中加入我們想要的內容,使用的時候直接調用即可。

python

import requests

class SendSessionRequest:
“”“使用session鑒權的接口,記錄cookies/token”“”

  1. def __init__(self):

  2. self.session = requests.session()

  3. def requests(self, url, method, params=None, data=None, json=None, headers=None):

  4. method = method.lower()

  5. if method == "post":

  6. return self.session.post(url=url, json=json, data=data, headers=headers)

  7. elif method == "patch":

  8. return self.session.patch(url=url, json=json, data=data, headers=headers)

  9. elif method == "get":

  10. return self.session.get(url=url, params=params)

總結:

感謝每一個認真閱讀我文章的人!!!

作為一位過來人也是希望大家少走一些彎路,如果你不想再體驗一次學習時找不到資料,沒人解答問題,堅持幾天便放棄的感受的話,在這里我給大家分享一些自動化測試的學習資源,希望能給你前進的路上帶來幫助。

軟件測試面試文檔

我們學習必然是為了找到高薪的工作,下面這些面試題是來自阿里、騰訊、字節等一線互聯網大廠最新的面試資料,并且有字節大佬給出了權威的解答,刷完這一套面試資料相信大家都能找到滿意的工作。

?

? ? ? ? ? 視頻文檔獲取方式:
這份文檔和視頻資料,對于想從事【軟件測試】的朋友來說應該是最全面最完整的備戰倉庫,這個倉庫也陪伴我走過了最艱難的路程,希望也能幫助到你!以上均可以分享,點下方小卡片即可自行領取。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/23407.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/23407.shtml
英文地址,請注明出處:http://en.pswp.cn/web/23407.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

docker 拉取不到鏡像的問題:拉取超時

error pulling image configuration: download failed after attempts6: dial tcp 31.13.94.10:443: i/o timeout 首先設置國內的鏡像源&#xff1a;復制下面直接執行 sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-EOF{"registry-mirrors"…

【POSIX】消息類的格式與使用

本文給出一個MacOS操作系統中的消息類的使用過程示例&#xff08;結合gencat命令&#xff0c;<nl_types.h>頭文件以及catopen,catgets,catclose3個函數&#xff09; 首先根據對應的操作系統&#xff0c;查看 gencat 命令 man gencat 可以詳細看到其中對于輸入文件&…

Spark MLlib 機器學習詳解

目錄 &#x1f349;引言 &#x1f349;Spark MLlib 簡介 &#x1f348; 主要特點 &#x1f348;常見應用場景 &#x1f349;安裝與配置 &#x1f349;數據處理與準備 &#x1f348;加載數據 &#x1f348;數據預處理 &#x1f349;分類模型 &#x1f348;邏輯回歸 &a…

? 傳知代碼 ? 輔助任務改進社交帖子多模態分類

&#x1f49b;前情提要&#x1f49b; 本文是傳知代碼平臺中的相關前沿知識與技術的分享~ 接下來我們即將進入一個全新的空間&#xff0c;對技術有一個全新的視角~ 本文所涉及所有資源均在傳知代碼平臺可獲取 以下的內容一定會讓你對AI 賦能時代有一個顛覆性的認識哦&#x…

【自然語言處理】【Scaling Law】語言模型物理學 第3.3部分:知識容量Scaling Laws

語言模型物理學3.3&#xff1a;知識容量Scaling Laws 論文名稱&#xff1a;Physics of Language Models: Part 3.3, Knowledge Capacity Scaling Laws 論文地址&#xff1a;https://arxiv.org/pdf/2404.05405 相關博客 【自然語言處理】【Scaling Law】Observational Scaling …

R語言探索與分析17-股票題目

Value at Risk&#xff08;VaR&#xff09;是一種統計技術&#xff0c;用于量化投資組合在正常市場條件下可能遭受的最大潛在損失。它是風險管理和金融領域中一個非常重要的概念。VaR通常以貨幣單位表示&#xff0c;用于估計在給定的置信水平和特定時間范圍內&#xff0c;投資組…

OpenCV的小部件最基本范例

OpenCV也有與PYQT類似的小部件&#xff0c;例如滑塊slider。OpenCV可以用與PYQT類似的“信號與槽”方法&#xff0c;也可以在函數中直接查詢小部件的值。 import cv2 import numpy as npcv2.namedWindow(Show1) image np.zeros((100, 400, 3), np.uint8) # 創建一個空白內容…

JavaScript基礎知識4(數組、函數、參數、作用域、具名和匿名函數、邏輯運算符短路、轉化布爾類型)

JavaScript基礎知識4&#xff08;數組、函數、參數、作用域、具名和匿名函數、邏輯運算符短路、轉化布爾類型&#xff09; 數組數組是什么&#xff1f;數組的基本使用定義數組和數組單元訪問數組和數組索引數據單元值類型數組長度屬性 操作數組 函數聲明和調用聲明&#xff08;…

(面試官問我微服務與naocs的使用我回答了如下,面試官讓我回去等通知)微服務拆分與nacos的配置使用

微服務架構 正常的小項目就是所有的功能集成在一個模塊中&#xff0c;這樣代碼之間不僅非常耦合&#xff0c;而且修改處理的時候也非常的麻煩&#xff0c;應對高并發時也不好處理&#xff0c;所以 我們可以使用微服務架構&#xff0c;對項目進行模塊之間的拆分&#xff0c;每一…

前端傳參數后端變量類型能夠接受到List卻無法接收到值

問題描述 今天寫了個接口&#xff0c;下圖所示 ReqVO里是這樣的&#xff1a; 然后前端去請求&#xff0c;從請求結果中看發現這里值是在的&#xff08;有經驗的可能就看出來了otherInfo.id: 這樣以參數后端是接收不到的&#xff0c;但是當時沒發現&#xff09; 傳進來后端…

維納運動的概念

維納運動&#xff08;Wiener Process&#xff09;&#xff0c;也稱為標準布朗運動&#xff0c;是一種重要的隨機過程&#xff0c;廣泛應用于數學、物理學和金融學等領域。它是一個連續時間的隨機過程&#xff0c;具有一些特殊的性質&#xff0c;使其成為描述隨機動態系統的經典…

GAT1399協議分析(8)--批量圖像查詢

一、請求消息定義 視頻圖像包含視頻片段、 圖像、 文件、 人員、 人臉、 機動車、 非機動車、 物品、 場景和視頻案事件、 視頻圖像標簽等對象 在消息體中,可以包含其中一種類,加上Data字段即可。 ImageInfo對象 二、請求消息實例 wireshark 抓包實例 請求: 文本化: /V…

制造執行MES系統在光伏行業的應用

全球對可再生能源的需求不斷增長&#xff0c;光伏能源作為一種清潔、可持續的能源形式&#xff0c;已經在廣泛應用中受到了廣泛關注。為滿足工業領域的光伏能源需求&#xff0c;光伏制造執行系統(MES)作為一種集成化的技術解決方案&#xff0c;提供了更高效、更可靠的解決方案。…

WPS的JSA算國產編程語言,IDE,腳本工具嗎?javascript代替VBA

現在wps用javascript代替VBA&#xff0c;應該算很成功了吧。 如果可以獨立出來變成一個腳本語言&#xff0c;簡單的IDE(本身也有類似VBA&#xff0c;不要寄宿在WPS里面運行&#xff0c;這樣就可以變成VBS一樣執行腳本了&#xff0c;用來開發按鍵精靈,LUA一樣的腳本很不錯 以下…

Activity->Activity中動態添加Fragment->Fragment回退棧BackStack

Fragment回退棧 Fragment回退棧用于管理Fragment的導航歷史(添加、刪除、替換)。每個Activity都有一個包含其所有Fragment的FragmentManager&#xff0c;調用其addToBackStack方法時&#xff0c;這個事務就會被添加到FragmentManager的回退棧中當用戶按下返回鍵時&#xff0c;…

MySQL報ERROR 2002 (HY000)解決

今天在連接客戶服務器時MySQL的時候報: ERROR 2002 (HY000): Can’t connect to local MySQL server through socket ‘/tmp/mysql/mysql.sock’ (2) [rootXXX ~]# mysql -uroot -p Enter password: ERROR 2002 (HY000): Can’t connect to local MySQL server through socket…

rman恢復后,少部分數據文件狀態為MISSING000**

客戶有套一體機&#xff0c;每天晚上21點開始做rman完全備份&#xff0c;大約第2天上午9點多完成備份&#xff0c;rman備份保留策略保留一份完全備份 6月1日晚21點自動發起備份&#xff0c;6月2日上午10點15分完成備份&#xff0c;并生成了一個控制文件備份 c-4063271871-2024…

前端圖片在切換暗黑模式時太亮該怎么辦?

通過css中的filter屬性來實現&#xff0c;進行圖片的色系反轉、亮度、對比度調整等 1、invert 反轉輸入圖像&#xff0c;值為 100% 則圖像完全反轉&#xff0c;值為 0% 則圖像無變化 filter: invert(1); 2、blur 給元素應用高斯模糊效果。 filter: blur(5px); 3、brightnes…

如何解決網絡問題?

組織和 IT 管理員盡其所能完善他們的網絡&#xff0c;但是&#xff0c;不同程度的網絡問題仍然可能出現&#xff0c;這些網絡問題需要立即響應和解決&#xff0c;如果這些問題在不合理的時間內得不到解決&#xff0c;網絡和組織的損害可能會付出高昂的代價。這就是為什么 IT 管…

【漏洞復現】銳捷校園網自助服務系統 login_judge.jsf 任意文件讀取漏洞(XVE-2024-2116)

0x01 產品簡介 銳捷校園網自助服務系統是銳捷網絡推出的一款面向學校和校園網絡管理的解決方案。該系統旨在提供便捷的網絡自助服務&#xff0c;使學生、教職員工和網絡管理員能夠更好地管理和利用校園網絡資源。 0x02 漏洞概述 校園網自助服務系統/selfservice/selfservice…