日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python调用接口测试_Python接口测试实战2 - 使用Python发送请求

發布時間:2024/7/5 python 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python调用接口测试_Python接口测试实战2 - 使用Python发送请求 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本節內容

requests安裝

requests使用

JSON類型解析

requests庫詳解

帶安全認證的請求

序言

上節課我們學習了接口測試的理論,抓包工具及使用Postman手工測試各種接口,這節課我們主要講解使用Python語言來發送接口請求,實現接口測試自動化。

發送請求,我們這里主要使用Python的一個第三方包(需要先安裝):requests。

Python3自帶的http.client和urllib.request都能發送http請求,不過相對來說使用較麻煩,第三方庫requests讓發送請求更簡單,支持自動編碼解碼,會話保持,長連等

requests安裝

Windows: 打開cmd命令行,輸入pip install requests,等待安裝完成即可

Linux: (建議使用Python3),終端中輸入pip3 install requests,等待安裝完成即可

Mac: (建議使用Python3), sudo python3 -m pip install requests,等待安裝完成即可

驗證是否安裝成功:

打開命令行,輸入python,在python shell環境下輸入import requests沒有報錯即安裝成功

requests的使用

一個最簡單的GET請求

發送一個請求分3步:

組裝請求: 請求可能包含url,params(url參數),data(請求數據),headers(請求頭),cookies等,最少必須有url

發送請求,獲取響應:支持get,post等各種方法發送,返回的是一個響應對象

解析響應: 輸出響應文本

打開Pycharm,新建一個demo項目,項目下新建一個Python文件,輸入以下內容:

# 導入requests包

import requests

# 1. 組裝請求

url = "http://httpbin.org/get" # 這里只有url,字符串格式

# 2. 發送請求,獲取響應

res = requests.get(url) # res即返回的響應對象

# 3. 解析響應

print(res.text) # 輸出響應的文本

帶參數的GET請求

import requests

url = "http://www.tuling123.com/openapi/api?key=ec961279f453459b9248f0aeb6600bbe&info=你好" # 參數可以寫到url里

res = requests.get(url=url) # 第一個url指get方法的參數,第二個url指上一行我們定義的接口地址

print(res.text)

import requests

url = "http://www.tuling123.com/openapi/api"

params = {"key":"ec961279f453459b9248f0aeb6600bbe","info":"你好"} # 字典格式,單獨提出來,方便參數的添加修改等操作

res = requests.get(url=url, params=params)

print(res.text)

傳統表單類POST請求(x-www-form-urlencoded)

import requests

url = "http://httpbin.org/post"

data = {"name": "hanzhichao", "age": 18} # Post請求發送的數據,字典格式

res = requests.post(url=url, data=data) # 這里使用post方法,參數和get方法一樣

print(res.text)

JSON類型的POST請求(application/json)

import requests

url = "http://httpbin.org/post"

data = '''{

"name": "hanzhichao",

"age": 18

}''' # 多行文本, 字符串格式,也可以單行(注意外層有引號,為字符串) data = '{"name": "hanzhichao", "age": 18}'

res = requests.post(url=url, data=data) # data支持字典或字符串

print(res.text)

data參數支持字典格式也支持字符串格式,如果是字典格式,requests方法會將其按照默認表單urlencoded格式轉換為字符串,如果是字符串則不轉化

如果data以字符串格式傳輸需要遵循以下幾點:

必須是嚴格的JSON格式字符串,里面必須用雙引號,k-v之間必須有逗號,布爾值必須是小寫的true/false等等

不能有中文,直接傳字符串不會自動編碼

一般來說,建議將data聲明為字典格式(方便數據添加修改),然后再用json.dumps()方法把data轉換為合法的JSON字符串格式

import requests

import json # 使用到JSON中的方法,需要提前導入

url = "http://httpbin.org/post"

data = {

"name": "hanzhichao",

"age": 18

} # 字典格式,方便添加

headers = {"Content-Type":"application/json"} # 嚴格來說,我們需要在請求頭里聲明我們發送的格式

res = requests.post(url=url, data=json.dumps(data), headers=headers) # 將字典格式的data變量轉換為合法的JSON字符串傳給post的data參數

print(res.text)

或直接將字典格式的data數據賦給post方法的JSON參數(會自動將字典格式轉為合法的JSON文本并添加headers)

import requests

url = "http://openapi.tuling123.com/openapi/api/v2"

data = {

"reqType":0,

"perception": {

"inputText": {

"text": "附近的酒店"

},

"inputImage": {

"url": "imageUrl"

},

"selfInfo": {

"location": {

"city": "北京",

"province": "北京",

"street": "信息路"

}

}

},

"userInfo": {

"apiKey": "ec961279f453459b9248f0aeb6600bbe",

"userId": "206379"

}

}

res = requests.post(url=url, json=data) # JSON格式的請求,將數據賦給json參數

print(res.text)

練習:

利用圖靈聊天接口(GET) http://www.tuling123.com/openapi/api?key=ec961279f453459b9248f0aeb6600bbe&info=你好,結合Python的input編寫一個機器人聊天室

利用圖靈查詢接口(POST)http://openapi.tuling123.com/openapi/api/v2,封裝一個實用的查詢方法,查詢你附近的美食等等

JSON類型解析

序列化和反序列化

程序中的對象,如Python中的字典、列表、函數、類等,都是存在內存中的,一旦斷電就會消失,不方便傳遞或存儲,所以我們需要將內存中的對象轉化為文本或者文件格式,來滿足傳輸和持久化(存儲)需求

序列化: 內存對象 -> 文本/文件

反序列化: 文本 -> 內存對象

對象在HTTP中的傳輸過程

HTTP協議是超文本傳輸協議,是通過文本或二進制進行傳輸的,所以我們發送的請求要轉化成文本進行傳輸,收到的響應也是文本格式,如果是JSON,一般還需要將文本格式重新轉化為對象

JSON對象(Python字典) -> 轉為文本請求 -> 發送請求

-> 服務器收到文本請求 -> 將文本請求轉化為對象,獲取其中的參數,處理業務

-> 返回文本格式的響應 -> 客戶端轉為對象格式來從響應中取值

JSON對象與Python字典的區別

JSON對象是javascript object即javascript中的對象,是一種通用的格式,格式嚴格,不支持備注。

JSON文本和JSON對象的區別:

JSON文本是符合JSON格式的文本,實際上是一個字符串

JSON對象是內存中一個對象,擁有屬性和方法,可以通過對象獲取其中的參數信息

Python中我們一般提到JSON對象指的是字典

Python的字典的格式和JSON格式,稍有不同:

字典中的引號支持單引號和雙引號,JSON格式只支持雙引號

字典中的True/False首字母大寫,JSON格式為true/false

字典中的空值為None, JSON格式為null

JSON格式操作方法

序列化(字典 -> 文本/文件句柄): json.dumps()/json.dump()

反序列化(文本/文件句柄 -> 字典) : json.loads()/json.load()

import json # 需要導入JSON包

data = {'name': '張三', 'password': '123456', "male": True, "money": None} # 字典格式

str_data = json.dumps(data) # 序列化,轉化為合法的JSON文本(方便HTTP傳輸)

print(str_data)

輸出:{"name": "\u5f20\u4e09", "password": "123456", "male": true, "money": null}

json.dumps()支持將json文本格式化輸出

import requests

import json

res = requests.post("http://www.tuling123.com/openapi/api?key=ec961279f453459b9248f0aeb6600bbe&info=怎么又是你")

print(res.text) # 輸出為一行文本

res_dict = res.json() # 將響應轉為json對象(字典)等同于`json.loads(res.text)`

print(json.dumps(res_dict, indent=2, sort_keys=True, ensure_ascii=False)) # 重新轉為文本

看一下輸出結果對比:

{"code":100000,"text":"我才要說怎么又是你"} # res.text,有些接口中文會返回為\u..

{

"code": 100000,

"text": "我才要說怎么又是你" # 樹狀格式,比較清晰,顯示中文

}

indent: 縮進空格數,indent=0輸出為一行

sork_keys=True: 將json結果的key按ascii碼排序

ensure_ascii=Fasle: 不確保ascii碼,如果返回格式為utf-8包含中文,不轉化為\u...

反序列化

import json

res_text = {"name": "\u5f20\u4e09", "password": "123456", "male": true, "money": null} # JSON文本格式的響應信息

res_dict = json.loads(res_text) # 轉化為字典

print(res_dict['name']) # 方便獲取其中的參數值

輸出:張三

文件的序列化與反序列化

序列化:字典 -> 文件句柄

import json

res_dict = {'name': '張三', 'password': '123456', "male": True, "money": None} # 字典格式

f = open("demo1.json","w")

json.dump(res_dict, f)

查看同級目錄,增加了一個demo1.json文件,內容為:

{"name": "\u5f20\u4e09", "password": "123456", "male": true, "money": null}

序列化: 文件句柄 -> 字典

在項目中(和下面腳本文件同一路徑下)新建demo2.json文件,內容如下,保存

{

"name": "張三",

"password": "123456",

"male": true,

"money": null

}

新建Python文件

import json

f = open("demo.JSON","r", encoding="utf-8") # 文件中有中文需要指定編碼

f_dict = json.load(f) # 反序列化將文件句柄轉化為字典

print(f['name']) # 讀取其中參數

f.close()

什么時候使用JSON對象(字典)什么時候使用JSON文本?

一般在組裝data參數時,建議使用字典格式,發送請求時用json.dumps(data)轉化為文本發送,收到請求后使用json.loads(res.text)轉化為字典,方便我們獲取其中的參數信息

練習:

解析以下json格式文件,發送請求并打印響應

注: method支持get和post,如果沒有method,有data默認發post請求,沒有data默認發get請求,type支持:form或json,沒有默認發form格式

demo1.json

{

"url": "http://www.tuling123.com/openapi/api",

"method": "get",

"params": {

"key": "ec961279f453459b9248f0aeb6600bbe",

"info": "你好"

}

}

demo2.json

{

"url": "http://openapi.tuling123.com/openapi/api/v2",

"method": "post",

"type": "json",

"data": {

"reqType": 0,

"perception": {

"inputText": {

"text": "附近的酒店"

},

"inputImage": {

"url": "imageUrl"

},

"selfInfo": {

"location": {

"city": "北京",

"province": "北京",

"street": "信息路"

}

}

},

"userInfo": {

"apiKey": "ec961279f453459b9248f0aeb6600bbe",

"userId": "206379"

}

}

}

requests庫詳解

請求方法

requests.get()

requests.post()

requests.put()

...

requests.session(): 用于保持會話(session)

除了requests.session()外,其他請求方法的參數都差不多,都包含url,params, data, headers, cookies, files, auth, timeout等等

請求參數

url: 字符串格式,參數也可以直接寫到url中

params:url參數,字典格式

data: 請求數據,字典或字符串格式

headers: 請求頭,字典格式

cookies: 字典格式,可以通過攜帶cookies繞過登錄

files: 字典格式,用于混合表單(form-data)中上傳文件

auth: Basic Auth授權,數組格式 auth=(user,password)

timeout: 超時時間(防止請求一直沒有響應,最長等待時間),數字格式,單位為秒

響應解析

res.status_code: 響應的HTTP狀態碼

res.reason: 響應的狀態碼含義

req.text:響應的文本格式,按req.encoding解碼

req.content: 響應的二進制格式

req.encoding: 解碼格式,可以通過修改req.encoding='utf-8'來解決一部分中文亂碼問題

req.apparent_encoding:真實編碼,由chardet庫提供的明顯編碼

req.json(): (注意,有括號),響應的json對象(字典)格式,慎用!如果響應文本不是合法的json文本,或報錯

req.headers: 響應頭

req.cookies: 響應的cookieJar對象,可以通過req.cookies.get(key)來獲取響應cookies中某個key對應的值

...

示例:

import requests

res = requests.get("https://www.baidu.com")

print(res.status_code, res.reason) # 200 OK

print(res.text) # 文本格式,有亂碼

print(res.content) # 二進制格式

print(res.encoding) # 查看解碼格式 ISO-8859-1

print(res.apparent_encoding) # utf-8

res.encoding='utf-8' # 手動設置解碼格式為utf-8

print(res.text) # 亂碼問題被解決

print(res.cookies.items()) # cookies中的所有的項 [('BDORZ', '27315')]

print(res.cookies.get("BDORZ")) # 獲取cookies中BDORZ所對應的值 27315

帶安全認證的請求

需要登錄的請求(Cookie/Session認證)

未登錄訪問接口

使用會話保持

import requests

s = requests.session() # 新建一個會話

s.post(url="https://demo.fastadmin.net/admin/index/login.html",data={"username":"admin","password":"123456"}) # 發送登錄請求

res = s.get("https://demo.fastadmin.net/admin/dashboard?ref=addtabs") # 使用同一個會話發送get請求,可以保持登錄狀態

print(res.text)

如果不使用session()而單獨發一個post登錄請求一個get請求是否可以呢?你可以自己試一下(requests.get()或post()每次都會建立一個新會話)

抓取cookies

import requests

url = "https://demo.fastadmin.net/admin/dashboard?ref=addtabs"

cookies = {"PHPSESSID":"9bf6b19ddb09938cf73d55a094b36726"}

res = requests.get(url=url, cookies=cookies) # 攜帶cookies發送請求

print(res.text)

兩種方式的對比

使用session方式:每次都要發送兩次請求,效率較低

使用攜帶cookies方式:需要手動抓包,提取組裝,cookies中是session有一定有效期,過期之后要重新抓取和更換cookies

如果很多或所有請求都需要登錄,可以發一次請求,保持該session為全局變量,其他接口都使用該session發送請求(同樣要注意登錄過期時間)

練習

抓包并用腳本發一條微博或一篇博客

appid或token方式

appid: 系統為合法用戶賦予的訪問id,固定的字符串,一般經過加密以確保HTTP傳輸中的安全

token: 即令牌,固定或需要動態申請(有一定有效期),一般由用戶信息及申請時間計算加密而成,用于驗證接口訪問的權限

token與session的區別

session是存在服務器的,服務端通過驗證客戶端的請求所攜帶的session值在服務會話中是否存在,來驗證用戶是否合法

token: 是按一定算法加密計算出來的,服務端通過解密客戶端所攜帶的token值來驗證用戶是否合法

**示例: **

訪問百度AI開發者平臺:http://ai.baidu.com/,注冊并登錄,成為開發者,選擇文字識別

根據文檔新建應用,查看自己的App Key和Secret Key

創建應用

獲取token

通用文字接口

從網絡上找一張帶文字的圖片,右鍵,復制圖片地址(注意不支持https地址的圖片)

帶文字的圖片

請求結果

import requests

import json

app_key = 'kPoFYw85FXsnojsy5bB9hu6x'

secret_key = 'l7SuGBkDQHkjiTPU3m6NaNddD6SCvDMC'

img_url = '//upload-images.jianshu.io/upload_images/7575721-40c847532432e852.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240'

# 獲取token

get_token_url = 'https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id={}&client_secret={}'.format(app_key,secret_key)

token = requests.get(url=get_token_url).json().get("access_token") # 從獲取token接口的響應中取得token值

# 識別圖片文字

orc_url = 'https://aip.baidubce.com/rest/2.0/ocr/v1/general_basic?access_token={}'.format(token)

data = {"url": img_url}

res = requests.post(url=orc_url, data=data)

print(json.dumps(res.json(), indent=2, ensure_ascii=False)) # 格式化輸出

顯示結果:

{

"log_id": 4745549456768330559,

"words_result_num": 6,

"words_result": [

{

"words": "我又問:那么何時,你帶我回去?"

},

{

"words": "蓮師言:你是你,我是我。你若不愿流連凡塵,自會回去。"

},

{

"words": "我問蓮師:我從哪里來,要到哪里去?"

},

{

"words": "蓮師言:世間種種變相,皆有起源。來與去皆是命中定數,不可參度。"

},

{

"words": "我再問:我是否還會再見到你?"

},

{

"words": "蓮師言:你若心中有我,自然會再見。"

}

]

}

練習:

自己注冊任意一個開發者平臺(微信開發者平臺,百度開發者平臺,餓了么開發者平臺),創建應用,根據相應的授權方式獲取token,并使用token正常訪問一個接口

開放協議授權

reqeusts支持Basic Auth(基本授權)和Digist Auth(摘要授權)

Oauth1.0 Oauth2.0 參考: requests官方文檔

Basic Auth

import requests

import json

# 基本授權可以直接在請求方法中使用`auth = (user,password)`

res = requests.get("https://api.github.com/user", auth=("hanzhichao", "hanzhichao123"))

print(json.dumps(res.json(), indent=2, ensure_ascii=False)) # 格式化輸出

數字簽名

無論是cookie/session還是appid/token方式,只用來驗證請求者身份而不驗證參數,因此無法防止請求參數被抓包攔截后篡改(仍攜帶合法的cookie或token)

數字簽名(sign或sig)是用來對原始參數整體進行加密后生成的一個字符串,請求時參數和簽名一期發送,服務器收到請求后對參數再次計算簽名核對和所攜帶的簽名是否一致。

例如: 原始簽名{}

總結

以上是生活随笔為你收集整理的python调用接口测试_Python接口测试实战2 - 使用Python发送请求的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。