使用python或robotframework调multipart/form-data接口上传文件

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

header.png

WebForms:

form.png

2、python-requests实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
!/usr/bin/env python
-*- coding: utf-8 -*-
import requests #导入依赖模块

#构造数据,设置file为一个tuple字典形式,看到网上也有构造成list的形式的,没有走通。
#示例接口是普通的字段和文件混合传的,所以根据上面截图的一行行对应下来,就是这个样子的
#为什么用这个形式,查看官方文档:#http://docs.python-requests.org/en/master/user/advanced/#post-multiple-multipart-encoded-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:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
更新一个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} 

参考链接:http://blog.csdn.net/j_akill/a … 60293
http://my.oschina.net/dfsj66011/blog/598381
http://docs.python-requests.or … files