Robot Framework如何通过URL流式上传Zip文件至API?
解决Robot Framework直接从URL上传二进制文件的问题
嘿,这个需求我之前刚好碰到过,给你两个在Robot Framework里能落地的方案,亲测好用:
方案一:自定义Python关键字(推荐,复用性高)
核心思路是用Python封装从URL获取二进制流的逻辑,然后在Robot里调用这个自定义关键字,再结合RequestsLibrary完成上传。
步骤1:编写自定义Python库(比如命名为RemoteFileUtils.py)
import requests from io import BytesIO def get_remote_file_stream(url, auth=None, headers=None): """从指定URL获取文件的二进制流,返回类文件对象""" # 支持添加认证、自定义请求头(如果目标URL需要的话) response = requests.get(url, stream=True, auth=auth, headers=headers) response.raise_for_status() # 如果请求失败直接抛出异常 # 将二进制内容转为BytesIO对象,模拟本地文件流 return BytesIO(response.content)
步骤2:在Robot测试用例中调用
*** Settings *** Library RequestsLibrary Library ./RemoteFileUtils.py # 导入自定义库,路径根据实际情况调整 *** Test Cases *** Upload Zip From Remote URL # 1. 创建API会话 Create Session upload_service http://your-upload-api-domain.com # 2. 从远程URL获取文件流(如果URL需要认证,可加auth参数,比如auth=('username','password')) ${file_stream} Get Remote File Stream http://X.X.X.X/test.zip # 3. 构造上传参数,注意`file`要和API要求的表单字段名一致 ${upload_params} Create Dictionary file=${file_stream};filename=test.zip # 4. 发送POST上传请求 ${response} Post Request upload_service /api/upload-endpoint files=${upload_params} # 5. 验证上传结果 Should Be Equal As Strings ${response.status_code} 200 Log Upload success! Response: ${response.json()}
方案二:用Inline Python代码块(轻量,无需额外文件)
如果不想单独写Python文件,可以直接用Robot的Evaluate关键字执行Python代码,完成流获取和上传:
*** Settings *** Library RequestsLibrary *** Test Cases *** Upload File With Inline Python Create Session upload_api http://your-upload-api-domain.com # 1. 从远程URL获取二进制内容 ${file_content} Evaluate requests.get("http://X.X.X.X/test.zip").content modules=requests # 2. 把字节内容转为类文件对象 ${file_stream} Evaluate io.BytesIO(${file_content}) modules=io # 3. 构造上传参数并发送请求 ${files} Create Dictionary file=${file_stream};filename=test.zip ${response} Post Request upload_api /api/upload-endpoint files=${files} # 验证结果 Should Contain ${response.text} success
注意事项
- 确保目标API支持
multipart/form-data格式的文件上传(大部分文件上传API都是这个格式) - 如果目标URL需要权限验证,可以在
requests.get里添加auth或headers参数(比如带Token的请求头) - 处理超大文件时,建议用
stream=True分块读取,避免内存占用过高(方案一已经默认开启)
内容的提问来源于stack exchange,提问作者ForMartha
相关产品推荐
相关产品推荐

