python接口测试:post传入参数为base64的加密数据

本文介绍如何利用Python中的requests库与base64库实现POST接口请求的参数加密发送,详细步骤包括参数字典转化为字符串、使用base64进行加密、构造请求并发送。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

# -*- coding : utf-8 -*-
import requests
import base64
import json

url = 'http://xxx.api'
data = {"id": "1","phone":"13255558888"}

encode = base64.b64encode(json.dumps(data))

r = requests.post(url,data={"data":encode})
print r.text


说明:

1.先将传参由dict字典格式转为str字符串格式,json.dumps(),因为base64只能对字符串格式的进行加密

2.传参需进行base64加密:导入base64.b64encode(),同理base64解密:base64.b64decode()

3.进行post类型的接口请求requests.post(url,data=xxx),这里尤其要注意data也要用dict字典格式显示!!!!

4.传参过程中不用关注data里参数排列顺序,采用map形式的任意排序

<think>我们有一个Python脚本,它实现了以下功能:1.使用HMAC-SHA256签名获取Token(通过`do_get_token`方法)2.使用获取到的Token调用API(通过`call_url`方法)3.包含一个AES解密的工具方法(`decrypt_field`)现在需要将这个API调用过程在ApiPost软件中进行测试。ApiPost是一个API调试工具,支持发送HTTP请求、设置认证、编写脚本等。步骤分解:1.**获取Token的请求**:对应`do_get_token`方法,这是一个GET请求,需要传递三个参数:`access_key`,`timestamp`,`signature`。其中`signature`是通过对`access_key`和`timestamp`按字典排序后拼接的字符串进行HMAC-SHA256签名得到的。2.**使用Token调用API**:对应`call_url`方法,这是一个POST请求,需要在Header中设置`X-ACCESS-TOKEN`和`Content-Type:application/json`,并且传递JSON格式的请求体(如果有参数)。3.**解密响应**(如果需要):如果API返回的数据中有加密字段,我们可以使用`decrypt_field`方法进行解密。在ApiPost中,我们可以通过后置脚本来实现解密。具体在ApiPost中的操作步骤:###步骤1:创建获取Token的请求-**请求URL**:`https://drs.dsjfzj.cq.cegn:11007/apisix/token`-**请求方法**:GET-**请求参数**:-`access_key`:`BCDSGA_20b112c5a9d45bd38f7e5efe72be4fb3`-`timestamp`:当前时间戳(可以通过动态变量获取,如`{{timestamp}}`)-`signature`:需要计算,暂时留空(我们可以在前置脚本中计算并设置)####前置脚本(Pre-requestScript):在发送请求前,我们需要计算签名。ApiPost支持JavaScript编写前置脚本。```javascript//获取当前时间戳(秒)consttimestamp=Math.floor(Date.now()/1000);//设置环境变量,以便在请求参数中使用apt.setEnvironmentVariable("timestamp",timestamp);//定义access_key和secret_keyconstaccess_key="BCDSGA_20b112c5a9d45bd38f7e5efe72be4fb3";constsecret_key="BCDSGS_35c0eee59372a29842973c12d4e71d6b";//构造待签名字符串:按参数名排序后拼接constparams={access_key:access_key,timestamp:timestamp};//排序并拼接constsortedKeys=Object.keys(params).sort();letsignString='';sortedKeys.forEach(key=>{signString+=`${key}=${params[key]}&`;});signString=signString.slice(0,-1);//去掉最后一个'&'//使用HMAC-SHA256计算签名constsignature=CryptoJS.HmacSHA256(signString,secret_key).toString(CryptoJS.enc.Hex);//设置环境变量,用于请求参数signatureapt.setEnvironmentVariable("signature",signature);```然后,在请求参数中,我们可以这样设置:-`access_key`:`{{access_key}}`(这里可以直接写死,或者通过环境变量传入)-`timestamp`:`{{timestamp}}`-`signature`:`{{signature}}`注意:在ApiPost中,我们可以在请求参数的值中使用`{{变量名}}`来引用环境变量或全局变量。####发送请求并保存Token发送请求后,我们可以在后置脚本(Post-responseScript)中解析响应,将获取到的Token保存到环境变量中,以便后续请求使用。```javascript//解析响应constresponseJson=apt.getResponseObject();//假设返回的JSON中有一个字段叫token(具体根据实际返回结构)consttoken=responseJson.token;//注意:根据实际返回结构,可能是responseJson.data.token等//设置环境变量apt.setEnvironmentVariable("token",token);//同时记录token的过期时间(如果有的话),这里假设返回中有expire_time字段,如果没有,我们可以根据实际有效时间设置一个//例如,如果返回的expire_time是时间戳,我们可以保存它constexpire_time=responseJson.expire_time;apt.setEnvironmentVariable("token_expire",expire_time);```###步骤2:创建调用API的请求-**请求URL**:`https://drs.dsjfzj.cq.cegn:11007/restapi/prod/IC50000020250616000140/xdata/tbl/api/execute/1a929ab0-467c-490f-91c7-17533d3e8838`-**请求方法**:POST-**Headers**:-`X-ACCESS-TOKEN`:`{{token}}`(使用环境变量token)-`Content-Type`:`application/json`-**Body**:选择raw-JSON,根据实际需要填写JSON参数(如`param`对象的内容)####前置脚本(可选):在这个请求的前置脚本中,我们可以检查token是否即将过期(比如在60秒内过期),如果即将过期,则重新获取token。但是,由于ApiPost的请求是独立的,我们通常是在第一个请求中获取token并保存,然后在后续请求中使用。如果担心过期,可以在每次调用前都先获取一次,或者设置定时刷新。不过,根据我们的Python代码,它会在token快过期时重新获取。我们可以这样写前置脚本:```javascript//获取当前时间戳(秒)constnow=Math.floor(Date.now()/1000);constexpire_time=apt.getEnvironmentVariable("token_expire");//如果token过期时间在60秒内,则重新获取tokenif(!expire_time||expire_time<now+60){//重新执行获取token的请求(这里需要先执行获取token的请求,然后更新环境变量)//但是ApiPost前置脚本中不能直接发送另一个请求,所以我们可以考虑将获取token的请求单独放在一个目录,然后使用接口关联(手动或使用集合运行)//或者,我们可以在这里提示用户需要重新获取token//由于ApiPost的局限性,通常我们在测试时手动获取一次token,然后在有效期内测试其他接口//或者,我们可以将这两个请求放在一个测试集合中,并在集合的预请求脚本中获取token,并设置整个集合的环境变量}```所以,更实际的做法是:将两个请求放在一个测试集合中,在集合的预请求脚本中获取token并设置环境变量,这样每个请求都可以使用这个token。同时,在集合中我们可以设置一个逻辑:在每次运行集合时,先获取一次token(覆盖旧的)。###步骤3:处理响应解密(如果需要)如果返回的响应中有加密字段,我们可以在后置脚本中调用解密函数进行解密。在ApiPost的后置脚本中,我们可以使用CryptoJS库(ApiPost内置了CryptoJS)来实现AES解密。但是注意,Python代码中使用的是AES-CBC模式,密钥是secret_key的后16位,并且使用PKCS7填充,初始向量(IV)也是密钥的后16位。####后置脚本示例(解密):假设返回的响应中有一个字段`encrypted_data`是需要解密的。```javascript//获取响应数据constresponseJson=apt.getResponseObject();constencrypted_data=responseJson.encrypted_data;//根据实际返回结构获取//解密函数functiondecrypt(encrypted,secretKey){//密钥取后16位constkey=CryptoJS.enc.Utf8.parse(secretKey.slice(-16));//初始向量也是密钥的后16位constiv=key;//Base64解码constencryptedBytes=CryptoJS.enc.Base64.parse(encrypted);//解密constdecrypted=CryptoJS.AES.decrypt({ciphertext:encryptedBytes},key,{iv:iv,mode:CryptoJS.mode.CBC,padding:CryptoJS.pad.Pkcs7});//转为字符串returndecrypted.toString(CryptoJS.enc.Utf8);}constsecret_key="BCDSGS_35c0eee59372a29842973c12d4e71d6b";//这里写你的secret_keyconstdecryptedData=decrypt(encrypted_data,secret_key);//将解密后的数据保存到环境变量或直接打印console.log("解密后的数据:",decryptedData);//或者将解密后的数据设置到环境变量apt.setEnvironmentVariable("decrypted_data",decryptedData);```###总结ApiPost测试步骤:1.在ApiPost中创建一个新项目。2.创建两个请求:-第一个请求:获取Token(GET请求,URL为Token地址,使用前置脚本计算签名,后置脚本保存Token)。-第二个请求:调用业务API(POST请求,设置Header和Body,使用环境变量中的Token)。3.如果需要,在第二个请求的后置脚本中编写解密逻辑。4.将两个请求加入一个测试集合,并在集合的预请求脚本中确保获取Token(可选,或者单独运行第一个请求后再运行第二个)。###注意事项:-ApiPost的环境变量有作用域(全局、环境、临时),请根据实际情况设置。-由于ApiPost的前置脚本不能发送HTTP请求,所以获取Token的请求必须单独发送一次,后续请求才能使用该Token。如果Token过期,需要重新运行获取Token的请求。-解密时使用的密钥是`secret_key`,在脚本中直接写入了,这并不安全。在实际使用中,可以考虑将密钥存储在ApiPost的环境变量中,然后通过`apt.getEnvironmentVariable("secret_key")`获取。###引用说明:在API接口设计中,使用HMAC签名可以有效提升安全性,每个请求使用独立的签名,防止重放攻击[^1]。同时,对于敏感数据,采用AES加密传输可以保障数据机密性[^3]。ApiPost作为接口调试工具,支持通过脚本实现复杂的签名计算和数据处理,极大方便了开发测试过程[^5]。§§相关问题§§1.如何优化ApiPost中的Token管理以避免频繁手动获取?2.在ApiPost中如何实现自动化的测试集合运行?3.除了AES-CBC,ApiPost后置脚本支持哪些加密算法?</think>### 在ApiPost中测试API接口的详细步骤 下面是针对您提供的Python代码(包含HMAC签名、Token获取和AES解密)在ApiPost中进行测试的完整指南: --- #### **步骤1:创建获取Token的请求** 1. **新建请求**: - 方法:`GET` - URL:`https://drs.dsjfzj.cq.cegn:11007/apisix/token` 2. **设置Query参数**: ```javascript // 前置脚本 (Pre-request Script) const access_key = "BCDSGA_20b112c5a9d45bd38f7e5efe72be4fb3"; const secret_key = "BCDSGS_35c0eee59372a29842973c12d4e71d6b"; const timestamp = Math.floor(Date.now() / 1000); // 当前时间戳(秒) // 生成签名 const params = { access_key, timestamp }; const sortedParams = Object.keys(params).sort().map(k => `${k}=${params[k]}`).join('&'); const signature = CryptoJS.HmacSHA256(sortedParams, secret_key).toString(CryptoJS.enc.Hex); // 设置到环境变量 apt.setEnvironmentVariable("signature", signature); apt.setEnvironmentVariable("timestamp", timestamp); ``` 3. **添加Query参数**: | Key | Value | 来源 | |-------------|---------------------|----------| | access_key | `BCDSGA_20b112c5a9d...` | 手动输入 | | timestamp | `{{timestamp}}` | 环境变量 | | signature | `{{signature}}` | 环境变量 | 4. **保存Token**: ```javascript // 后置脚本 (Post-response Script) const res = apt.getResponseObject(); apt.setEnvironmentVariable("token", res.token); // 保存Token到环境变量 apt.setEnvironmentVariable("expire_time", res.expire_time); // 保存过期时间 ``` --- #### **步骤2:创建业务API请求** 1. **新建请求**: - 方法:`POST` - URL:`https://drs.dsjfzj.cq.cegn:11007/restapi/prod/.../execute/1a929ab0-...` 2. **设置Headers**: | Key | Value | |-------------------|----------------------| | X-ACCESS-TOKEN | `{{token}}` | | Content-Type | `application/json` | 3. **设置Body**: ```json { "param": {} // 根据实际需求填写参数 } ``` 4. **Token有效期检查**: ```javascript // 前置脚本 (Pre-request Script) const now = Math.floor(Date.now() / 1000); const expireTime = apt.getEnvironmentVariable("expire_time"); if (!expireTime || expireTime < now + 60) { apt.sendRequest("获取Token的请求名称"); // 自动触发Token刷新 } ``` --- #### **步骤3:处理AES解密响应** 1. **添加解密脚本**: ```javascript // 后置脚本 (Post-response Script) function decryptField(encrypted, secretKey) { const key = CryptoJS.enc.Utf8.parse(secretKey.slice(-16)); const iv = key; const decrypted = CryptoJS.AES.decrypt( encrypted, key, { iv: iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 } ); return decrypted.toString(CryptoJS.enc.Utf8); } const res = apt.getResponseObject(); const secret_key = "BCDSGS_35c0eee59372a29842973c12d4e71d6b"; // 假设返回字段为encrypted_data if (res.encrypted_data) { res.decrypted_data = decryptField(res.encrypted_data, secret_key); apt.setResponseObject(res); // 更新响应 } ``` --- #### **步骤4:配置环境变量** 1. 在ApiPost中创建环境: ```json { "token": "", "expire_time": 0, "signature": "", "timestamp": 0 } ``` 2. 测试时选择该环境 --- #### **关键配置说明** 1. **HMAC签名原理**: - 签名生成公式:$signature = HMAC_{SHA256}(secret\_key, sorted\_params)$ - 参数按字典序排序后拼接[^1] 2. **AES解密流程**: ```mermaid graph LR A[Base64解码] --> B[AES-CBC解密] B --> C[PKCS7去除填充] C --> D[UTF-8解码] ``` 3. **安全建议**: - 在环境变量中存储敏感密钥 - 设置Token有效期检查防止过期 - 使用HTTPS保证传输安全[^3] > **注意**:实际URL和密钥需替换为您的真实数据,解密字段名需根据API响应结构调整。 --- ### 常见问题解决 1. **签名错误**: - 检查时间戳同步(时区问题) - 验证参数排序是否与代码一致 - 确认密钥是否正确 2. **解密失败**: - 检查密钥长度(必须16/24/32字节) - 确认加密模式是否为AES-CBC - 验证返回数据是否为Base64编码 3. **Token失效**: - 检查前置脚本的自动刷新逻辑 - 确认服务端Token有效期设置 通过以上步骤,您可以在ApiPost中完整测试包含HMAC签名、Token获取和AES解密的API调用流程[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值