python接口測試之新手篇


嗨,大家好,我是小白,好久沒寫博客了,最近公司搞什么python的接口測試,心里一陣狂喜,在公司上百個接口里拿出一個主要接口一頓亂搞,好在搞通了

但是在這過程中也碰到了好多的問題,決定將問題分享出來能夠對你們提供一絲絲的幫助!

工具:pycharm+requests+python3+fiddler

我暫時將我使用的接口稱為A接口

第一步:

首先我們手工發起一筆成功的A接口,

返回的json字符串:{"requestId":"20190220095236495","result":"00000","signature":"******","sum":"0.03"}

從字符串中的result我們知道返回成功了,signature為對返回結果進行了簽名,使用到的是MD5簽名

第二步:

查看fiddler,在Inspectors-Raw下邊提煉出我們想要的一些信息

從圖中我們知道這個請求為POST請求,content-Type:application/x-www-form-urlencoded,encoding:GBK  保存這些信息

第三步:

打開pycharm,在里邊通過字典設置A接口的各個參數,由於輸入參數signature是對所有參數進行MD5簽名,所以我們設置為空值,

對字典的value值進行for循環拼接,並調用MD5簽名方法進行簽名,方法如下:

然后我們再將返回的enc_res回傳到字典的鍵signature所對應的值

1) 設置A接口發起請求的url

2) 設置字典headers(直接從fiddler抓包的raw數據里copy過來),如下:

 3) 從抓包我們知道content-Type:application/x-www-form-urlencoded,所以發起post請求的參數為data而不是json

requests.post(url=url,data=payload,headers=headers)

 通過返回結果的status為200我們知道請求成功了,但是返回的result是一個錯誤碼,通過日志我們找到了原因如下:

可以看出accountName參數傳到后台為亂碼,因為pycharm里邊傳過去的中文,編碼都是UTF-8的,而后台編碼從抓包我們可以看到是GBK的形式,

所以我們需要改變一下這個參數編碼格式如圖:

因為A接口輸入參數有一個MD5的簽名參數,所以中文參數的這段編碼要放在輸入參數簽名之后,然后回傳進行覆蓋,進行post請求

再試一遍,我們發現返回結果成功了,並且我們對返回的參數再次進行調用MD5簽名校驗

 

 

沒有看懂的小伙伴可以留言,我們可以一起交流討論,哈哈,我是小白,歡迎閱讀!

 源碼分享一下,寫的沒什么層次,還請多多批評:

# -*- coding:utf-8 -*-
#autor :xiaobai
import requests
from requests.cookies import RequestsCookieJar
import json
import hmac
import hashlib
import time
import random
####################設置Key值##############

def hashstring(to_enc,ekey):
enc_res = hmac.new(ekey.encode(), to_enc.encode(), hashlib.md5).hexdigest()
# print(enc_res)
return enc_res

if __name__=='__main__':
print("開始進行**測試: ")
url='http://**********'
#設置隨機值作為入參id
id = []
id = ''.join(str(i) for i in random.sample(range(0, 9), 2)) # sample(seq, n) 從序列seq中選擇n個隨機且獨立的元素;
CurrentTime = time.strftime('%Y%m%d%H%M%S', time.localtime(time.time()))
requestid=CurrentTime+id
#請求參數
payload={'requestId':'',
'merchantCode':'',
'transferType':'',
'transToMerCode':'',
'transToMerName':'',
'unionBankNum':'',
'openBankName':'',
'openBankProvince':'',
'openBankCity':'',
'sum':'0.03',
'accountType':'1',
'accountName':'***',
'bankCode':'***',
'bankAccount':'*******',
'reason':'1555',
'noticeUrl':'**********',
'refundNoticeUrl':'*************',
'transferPayType':'*',
'signature':''
}
payload['requestId']=requestid
#初始化字符串並進行加密拼接
to_enc=''
ekey='CSSH_KEY'
for i in payload:
to_enc=to_enc+payload[i]
# print(to_enc)
payload['signature'] = hashstring(to_enc, ekey)

'''將中文進行GBK轉化'''
str='***' #這個字符串與字典里accountName對應value一致
    strGBK=str.encode('GBK')
'''轉化完的中文回傳到字典中'''
payload['accountName']=strGBK
headers={
'Connection':'keep-alive',
'Content-Length':'543',
'Cache-Control':'max-age=0',
'Origin':'http://**********',
'Upgrade-Insecure-Requests':'1',
'Content-Type':'application/x-www-form-urlencoded',
'User-Agent':'**************************************************',
'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
'Referer':'******************',
'Accept-Encoding':'gzip, deflate, br',
'Accept-Language':'zh-CN,zh;q=0.9',
}
s=requests.post(url=url,data=payload,headers=headers)
print(s.text)
print("status:",s.status_code)
print("****************************************************")
print("開始進行返回結果驗證簽名: ")
'''返回結果進行驗簽'''
ResultDict=s.json()
synchronizationStr=ResultDict['requestId'] + ResultDict['result'] + ResultDict['sum']
signature11=hashstring(synchronizationStr, ekey)
try:
if(ResultDict['result']=='00000' and signature11==ResultDict['signature']):
print(" 恭喜你,同步返回驗簽成功")
else:
print(" result錯誤碼:", ResultDict['result'])
except BaseException as msg:
print(msg)
finally:
print(" **處理完畢")
print("****************************************************")

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM