python接口測試之新手篇

嗨,你們好,我是小白,很久沒寫博客了,最近公司搞什麼python的接口測試,內心一陣狂喜,在公司上百個接口裏拿出一個主要接口一頓亂搞,好在搞通了html

可是在這過程當中也碰到了好多的問題,決定將問題分享出來可以對大家提供一絲絲的幫助!python

工具:pycharm+requests+python3+fiddlerweb

我暫時將我使用的接口稱爲A接口json

第一步:cookie

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

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

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

第二步:post

查看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("****************************************************")
相關文章
相關標籤/搜索