嗨,大家好,我是小白,好久没写博客了,最近公司搞什么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("****************************************************")

python接口测试之新手篇的更多相关文章

  1. python接口测试之mock(二)

    上一篇对mock-server已经做了初步的介绍,今天这里继续接着之前的介绍进行,我们先看之前的mock-server部分,之前编写了一个登录的mock,具体json文件见如下的内容: 小王子1110 ...

  2. API Test Postman接口测试之高级篇2

    API Test  Postman接口测试之高级篇2 一.继承父类的设置: 二.导出及导入: 三.分享文档: 四.发布接口文档: 五.常用脚本: 右边框选的是一些常用的脚本,postman提供的,可以 ...

  3. API Test Postman接口测试之高级篇1

    API Test  Postman接口测试之高级篇1 一.postman中的请求参数简介: 1.请求参数简介: 点击params下面会出现key,value等信息,这里填写的会自动追加在url地址后面 ...

  4. Python接口测试之moco

    在现在的软件开发过程中,特别是app的部分,需要的很多数据以及内容,都是来自server端的API,但是不能保证 在客户端开发的时候,api在server端已经开发完成,专门等着前端来调用,理想的情况 ...

  5. python接口测试之日志功能

    之前在简书中看了一篇关于日志功能的文档,供大家参考:https://www.jianshu.com/p/62f7b49b41e7 Python通过logging模块提供日志功能,所以直接导入即可 im ...

  6. Python接口测试之对MySQL/unittest框架/Requests 的操作

    单元测试支持测试自动化. 共享的安装程序和关闭代码测试. 聚合成集合,测试和报告框架从测试的独立性.单元测试模块提供可以很容易地支持这些素质的一组测试的类.关于unittest 测试框架建议可以到官方 ...

  7. 接口测试之基础篇--http协议

     概念:超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议.所有的WWW文件都必须遵守这个标准.设计HTTP最初的目的是为了提供一种 ...

  8. Python接口测试之报告(十五)

    在本文章中,主要使用jenkins和编写的自动化测试代码,来生成漂亮的测试报告,关于什么是CI这些 我就不详细的介绍了,这里我们主要是实战为主. 首先搭建java的环境,这个这里不做介绍.搭建好jav ...

  9. Python接口测试之对MySQL的操作(六)

    本文章主要来说python对mysql数据库的基本操作,当然,前提是已经搭建了python环境和搭建了Mysql 数据库的环境,python操作mysql数据库提供了MySQLdb库,下载的地址为: ...

随机推荐

  1. [转]白话HTTP短连接中的Session和Token

    我经常想象并怀念三十年前那原始而美好的互联网旧时光, 工作很轻松, 生活很悠闲. 上班的时候偶尔有些HTTP的请求发到我这里, 我简单的看一下, 取出相对应的html文档,图片,发回去就可以了, 然后 ...

  2. python开发笔记-字典按值排序取前n个key值

    场景举例: 假如我们有某个班级的语文成绩数据,格式为字典,其中字典key为学生姓名,value为学生成绩: 那么,如何获得单科成绩排名前3的学生姓名? 代码如下:--数据样例,方便测试 def dic ...

  3. Kubernetes 控制器之 Deployment 介绍(六)

    一.Deployment.ReplicaSet.Pod之间的关系 我们接着前面的文章说,如果不清楚的请查看之前的博文:http://blog.51cto.com/wzlinux/2322616 前面我 ...

  4. php_mvc实现步骤十

    shop34-19-商品添加 功能:添加商品表单 Index.php?p=back&c=Goods&a=add Controller-Action: 新建商品控制器类 Applicat ...

  5. LeetCode 572. 另一个树的子树(Subtree of Another Tree) 40

    572. 另一个树的子树 572. Subtree of Another Tree 题目描述 给定两个非空二叉树 s 和 t,检验 s 中是否包含和 t 具有相同结构和节点值的子树.s 的一个子树包括 ...

  6. KAFA 监测| Kafka监测的方法和工具

    1.目标 在我们上一篇Kafka教程中,我们讨论了Kafka Tools.今天,我们将看到Kafka Monitoring.在此,我们将学习如何监控Apache Kafka的概念.此外,我们将涵盖在故 ...

  7. Json 文件读写以及和IniFile 转换

    JSON 文件是越来越受欢迎了,以前程序配置文件用Ini,Ini 简练,简单.方便,但是也有不少缺点,比如,没有 JSON 直观,无法存储复杂点的数据类型. 于是乎,我封装了一个TJsonFile 的 ...

  8. Python开发之virtualenv和virtualenvwrapper详解

    在使用 Python 开发的过程中,工程一多,难免会碰到不同的工程依赖不同版本的库的问题: 亦或者是在开发过程中不想让物理环境里充斥各种各样的库,引发未来的依赖灾难. 此时,我们需要对于不同的工程使用 ...

  9. const指针和指向常量的指针

    先看下面六种写法: . const int p; . const int *p; . int const* p; . int * const p; . const int * const p; . i ...

  10. FIFO形成3x3矩阵

    Verilog生成矩阵一般是使用shift_ip核,但其实用两个FIFO也行.最近刚好学到这种方法,把原理总结一下. 要求 现在有10x5的数据和对应数据有效指示信号,数据为0~49,要用FPGA对其 ...