使用python或robotframework调multipart/form-data接口上传文件
这几天调一个multipart/form-data类型的接口,遇到点小阻碍。之前同事有使用urllib库写了个类似的方法实现,比较长,想要改的时候发现不太好使。在网上查找发现用requests库做这个更强大。下面具体介绍一下python-requests及robotframework-RequestsLibrary实现multipart/form-data接口上传文件。
1、从fiddler查看接口长这样:
Header:

WebForms:

2、python-requests实现
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import requests #导入依赖模块
#构造数据,设置file为一个tuple字典形式,看到网上也有构造成list的形式的,没有走通。
#示例接口是普通的字段和文件混合传的,所以根据上面截图的一行行对应下来,就是这个样子的
#为什么用这个形式,查看官方文档:#http://docs.python-requests.or ... files
multiple_files = {'id':(None,'181'),
'title':(None,u"拉新活动"),
'forceExternalBrowser':(None,u"否"),
'type':(None,u"文章"),
'location':(None,'http://${domain}/activity/appointment/?id=44&_=360'),
'picUrl': ('1.png', open('E:\\pics\\1.png', 'rb'), 'image/png') }
#接口url
server_url='http://${domain}/cn-jsfund-client-manage/manage/cms/banner/add'
#示例接口需登录,所以传了个cookie,放到header里面
headers1 = {'Cookie':'JSESSIONID=FD1CCB5ABFD79A055031B390397C411A'}
#请求接口
response=requests.post(server_url,files=multiple_files,headers=headers1)
print response.text
3、robotframework-RequestsLibrary实现
下面是rf case,没有完整suite,记得先import library RequestsLibrary:
{{{更新一个banner
${id_tup} Evaluate (None,'181') #创建tuple,因为不知道rf上怎么创建tuple,所以用了eval
${title_tup} Evaluate (None,u"拉新活动")
${for_tup} Evaluate (None,u"否")
${type_tup} Evaluate (None,u"文章")
${pic_tup} Evaluate ('1.png', open('E:/pics/1.png', 'rb'), 'image/png')
#然后创建file字典,和python那个一样了
&{multiple_files} Create Dictionary id=${id_tup} title=${title_tup} forceExternalBrowser=${for_tup} type=${type_tup} picUrl=${pic_tup}
#同样的:设置header
${header} Create Dictionary Cookie=JSESSIONID=0C800A4042D35BC62487E71431C2242D
#这个注释掉了,用requests库的Post也是可以发这个请求的,验证一下
Comment ${res} requests.Post ${domain}/cn-jsfund-client-manage/manage/cms/banner/add files=${multiple_files} headers=${header}
#下面两行,才是真正的requestslibrary的关键字,至于怎么长这样,请f5
#请注意,这里header一定要写在下面那行
Create Session api ${domain} ${header}
${res} Post Request api /cn-jsfund-client-manage/manage/cms/banner/add \ \ ${header} ${multiple_files}
log ${res.content} }}}
以上,为robotframework-requests (0.4.4)版本的实现方法。示例接口为普通的字段和文件混合传。RequestsLibrary作者在10月份fix了这个bug(https://github.com/bulkan/robotframework-requests/issues/131 )后,可以使用更简洁的方法处理这种情况了:

使用python或robotframework调multipart/form-data接口上传文件的更多相关文章
- 巨蟒python全栈开发django11:ajax&&form表单上传文件contentType
回顾: 什么是异步? 可以开出一个线程,我发出请求,不用等待返回,可以做其他事情. 什么是同步? 同步就是,我发送出了一个请求,需要等待返回给我信息,我才可以操作其他事情. 局部刷新是什么? 通过jq ...
- form表单上传文件使用multipart请求处理
在开发Web应用程序时比较常见的功能之一,就是允许用户利用multipart请求将本地文件上传到服务器,而这正是Grails的坚固基石——spring MVC其中的一个优势.Spring通过对Serv ...
- vue form表单上传文件
<script src="https://cdn.staticfile.org/vue-resource/1.5.1/vue-resource.min.js">< ...
- JsonResponse类的使用、form表单上传文件补充、CBV和FBV、HTML的模板语法之传值与过滤器
昨日内容回顾 Django请求生命周期 # 1.浏览器发起请求 到达Django的socket服务端(web服务网关接口) 01 wsgiref 02 uwsgi + nginx 03 WSGI协议 ...
- django 基于form表单上传文件和基于ajax上传文件
一.基于form表单上传文件 1.html里是有一个input type="file" 和 ‘submit’的标签 2.vies.py def fileupload(request ...
- 使用form表单上传文件
在使用form表单上传文件时候,input[type='file']是必然会用的,其中有一些小坑需要避免. 1.form的 enctype="multipart/form-data" ...
- day059-60 ajax初识 登录认证练习 form装饰器, form和ajax上传文件 contentType
一.ajax 的特点 1.异步交互:客户端发出一个请求后,需要等待服务器响应结束后, 才能发出第二个请求 2.局部刷新:给用户的感受是在不知不觉中完成请求和响应过程. 二.ajax 模板示例 ($.a ...
- WebAPI通过multipart/form-data方式同时上传文件以及数据(含HttpClient上传Demo)
简单的Demo,用于了解WebAPI如何同时接收文件及数据,同时提供HttpClient模拟如何同时上传文件和数据的Demo,下面是HttpClient上传的Demo界面 1.HttpClient部分 ...
- models渲染字典&form表单上传文件&ajax上传文件
{# {% for u in teacher_d.keys %}#} {# {% for u in teacher_d.values %}#} {% for k,u in teacher_d.item ...
随机推荐
- Laravel $request 常用方法
request的方法 描述 input('key','default-value') 此方法可以获取get请求所带来的特定参数的值,如果没有该参数可以提供默认值 all() 此方法获取get请求的所有 ...
- 剖析生产系统的I/O模式
剖析生产系统的I/O模式 2019/02/13 vmunix 了解I/O的特点对于优化系统性能非常重要,I/O是顺序的还是随机的,是读操作还是写操作,读写的比例是多少,I/O数据块的大小,这些都是影响 ...
- 2019-2020 ICPC, NERC, Southern and Volga Russian Regional Contest
目录 Contest Info Solutions A. Berstagram B. The Feast and the Bus C. Trip to Saint Petersburg E. The ...
- [转]C++ 模板 静态成员 定义(实例化)
提出问题: 如果有这样一个模板: template <typename T> class Test{ public: static std::string info; }; 对于以下若干种 ...
- 04_Logstash安装
Logstash部署 1.部署JDK环境 2.下载Logstash源码包 $ wget https://artifacts.elastic.co/downloads/logstash/logstash ...
- gdb 预备知识
1.gcc的-g选项 如果要使用gdb进行调试,必须在编译时在gcc中加入-g选项,使用参数 -g 表示将源代码调试信息编译到可执行文件中. #include <stdio.h> int ...
- codeforces514E
Darth Vader and Tree CodeForces - 514E When Darth Vader gets bored, he sits down on the sofa, closes ...
- Codeforces Round #597 (Div. 2)
A - Good ol' Numbers Coloring 题意:有无穷个格子,给定 \(a,b\) ,按以下规则染色: \(0\) 号格子白色:当 \(i\) 为正整数, \(i\) 号格子当 \( ...
- CF1174E Ehab and the Expected GCD Problem(动规+数论+分解)
做法 先来填第一个数,为了保证\(f(p)\)最大,第一个数分解一下为\(\prod\limits_{p_i}p_i^{k_i}\)使得\(\sum\limits_{k_i}\)最大 显然第一个数为\ ...
- LOJ#2977. 「THUSCH 2017」巧克力(斯坦纳树+随机化)
题目 题目 做法 考虑部分数据(颜色较少)的: 二分中位数\(mid\),将\(v[i]=1000+(v[i]>mid)\) 具体二分操作:然后求出包含\(K\)种颜色的联通快最小的权值和,判断 ...