1. 程式人生 > >使用python或robotframework調multipart/form-data接口上傳文件

使用python或robotframework調multipart/form-data接口上傳文件

multipart 比較 分享圖片 方法 更強 構造 ima force ann

這幾天調一個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 )後,可以使用更簡潔的方法處理這種情況了:

技術分享圖片 不要自己在header寫Content-Type!

使用python或robotframework調multipart/form-data接口上傳文件