嗨,大家好,我是小白,好久没写博客了,最近公司搞什么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 :xiaobaiimport requestsfrom requests.cookies import RequestsCookieJarimport jsonimport hmacimport hashlibimport timeimport 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("****************************************************")

转载于:https://www.cnblogs.com/unnameable/p/10405565.html

python接口测试之新手篇相关推荐

  1. Python 接口测试之处理转义字符的参数和编码问题

    目录 引言 处理入参有转义字符的接口 编码处理 接口请求方式 提取报文中参数 附录 引言 笔者,在非常繁忙的工作之余,决定抽时间记录一下在测试接口时所遇到的问题,以便日后参考,也可以提供给那些正在学习 ...

  2. Python接口测试之requests

    1.简介 requests是一个很实用的Python HTTP客户端库,编写爬虫和测试服务器响应数据时 经常会用到,Requests是Python语言的第三方的库,专门用于发送HTTP请求 2.前提 ...

  3. Python接口测试之moco

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

  4. 〖Python接口自动化测试实战篇⑩〗- 测试框架 unittest 的小实战案例

    说明:该文属于 Python全栈白宝书专栏,免费阶段订阅数量4300+,购买任意白宝书体系化专栏可加入TFS-CLUB 私域社区. 福利:除了通过订阅"白宝书系列专栏"加入社区获取 ...

  5. python接口测试之路get、post、json请求处理

    基于http协议,最常用的是GET和POST两种方法. 接口文档需要包含哪些信息: 接口名称 接口功能 接口地址 支持格式 json/xml 请求方式 请求示例 请求参数(是否必填.数据类型.传递参数 ...

  6. python接口测试之requests详解_Python接口测试-requests库

    一.requests库 Requests 是用Python语言编写,基于 urllib,采用 Apache2 Licensed 开源协议的 HTTP 库.它比 urllib 更加方便,可以节约我们大量 ...

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

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

  8. 〖Python接口自动化测试实战篇②〗- 摒弃 ‘捉虫师’ 称号 - 你需要重新认识软件测试

    万叶集

  9. 〖Python接口自动化测试实战篇①〗- 自动化测试基础扫盲及项目的生命周期详述

    万叶集

最新文章

  1. mybatis可以用oracle,使用MyBatis调用oracle函数(基于注释)
  2. php高级技术考试题,PHP高级技术考试题.doc
  3. linux grep命令总结
  4. java遍历两个日期_java 已知两个日期,遍历出两个日期之间所有的日期,重点是::包括第一个日期!!...
  5. 如何在ORACLE CLOUD中创建和访问容器集群丨内附官方文档链接
  6. 刚接触git,提交文件时,遇到no changes added to commit
  7. apache正向代理配置
  8. 玩 vmx ( by vision.ai ) 的过程记录
  9. thinkphp上传
  10. 10.企业安全建设指南(金融行业安全架构与技术实践) --- 安全预算、总结与汇报
  11. 成功解决:Could not initialize SDL - No available video device (Did you set the DISPLAY variable?)
  12. 组态软件(Configure)
  13. Ffmpeg常用转码命令
  14. 自学FPGA第一期:初学FPGA
  15. android苹果模拟器哪个好,mac安卓模拟器哪个好用?为你推荐网易mumu模拟器
  16. VUE微信开放平台实现网站微信登陆
  17. element-ul基本使用
  18. WOLFLAB CCNP交换-园区网安全PVLAN配置过程
  19. jdk配置环境变量(win10)
  20. 1.3.3 什么是好莱坞法则

热门文章

  1. (二)GKE上MLOps的Jenkins作业和部署
  2. 将$type添加到System.Text.Json序列化中,就像Newtonsoft那样用于动态对象属性
  3. Abp vnext Web应用程序开发教程 9 —— 作者:用户界面
  4. Kong 1.0 GA 版本正式发布,微服务 API 网关
  5. 决策树缺失值python_【机器学习笔记之二】决策树的python实现
  6. ionic滚动条返回顶部
  7. linux sed保存,linux sed
  8. 错误率_全新的支付方式来了 错误率可控制在百万分之一
  9. c++中判断某个值在字典的value中_Python元组、字典、集合的简单介绍
  10. vb6.0 生成exe被简称是木马_使用MSF渗透框架生成PHP木马并实现控制远程服务器