这几天调一个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接口上传文件的更多相关文章

  1. 巨蟒python全栈开发django11:ajax&&form表单上传文件contentType

    回顾: 什么是异步? 可以开出一个线程,我发出请求,不用等待返回,可以做其他事情. 什么是同步? 同步就是,我发送出了一个请求,需要等待返回给我信息,我才可以操作其他事情. 局部刷新是什么? 通过jq ...

  2. form表单上传文件使用multipart请求处理

    在开发Web应用程序时比较常见的功能之一,就是允许用户利用multipart请求将本地文件上传到服务器,而这正是Grails的坚固基石——spring MVC其中的一个优势.Spring通过对Serv ...

  3. vue form表单上传文件

    <script src="https://cdn.staticfile.org/vue-resource/1.5.1/vue-resource.min.js">< ...

  4. JsonResponse类的使用、form表单上传文件补充、CBV和FBV、HTML的模板语法之传值与过滤器

    昨日内容回顾 Django请求生命周期 # 1.浏览器发起请求 到达Django的socket服务端(web服务网关接口) 01 wsgiref 02 uwsgi + nginx 03 WSGI协议 ...

  5. django 基于form表单上传文件和基于ajax上传文件

    一.基于form表单上传文件 1.html里是有一个input type="file" 和 ‘submit’的标签 2.vies.py def fileupload(request ...

  6. 使用form表单上传文件

    在使用form表单上传文件时候,input[type='file']是必然会用的,其中有一些小坑需要避免. 1.form的 enctype="multipart/form-data" ...

  7. day059-60 ajax初识 登录认证练习 form装饰器, form和ajax上传文件 contentType

    一.ajax 的特点 1.异步交互:客户端发出一个请求后,需要等待服务器响应结束后, 才能发出第二个请求 2.局部刷新:给用户的感受是在不知不觉中完成请求和响应过程. 二.ajax 模板示例 ($.a ...

  8. WebAPI通过multipart/form-data方式同时上传文件以及数据(含HttpClient上传Demo)

    简单的Demo,用于了解WebAPI如何同时接收文件及数据,同时提供HttpClient模拟如何同时上传文件和数据的Demo,下面是HttpClient上传的Demo界面 1.HttpClient部分 ...

  9. models渲染字典&form表单上传文件&ajax上传文件

    {# {% for u in teacher_d.keys %}#} {# {% for u in teacher_d.values %}#} {% for k,u in teacher_d.item ...

随机推荐

  1. GitHub常用命令及使用

    GitHub使用介绍 摘要: 常用命令: git init 新建一个空的仓库git status 查看状态git add . 添加文件git commit -m '注释' 提交添加的文件并备注说明gi ...

  2. [ZJOI2009] 硬币游戏(找规律)

    题目 洛谷传送门 题解 把1/21/21/2转化成0/10/10/1,所以直接可以异或. 对于长度为nnn的0/10/10/1数列,发现每变换2k(k>1)2^k(k>1)2k(k> ...

  3. PHP 对参数签名

    对参数进行签名防止参数劫持 加入timestamp, 防止DOS攻击(但这次没有实现这个功能,后续再实现) interface BaseToken { /** * @param params arra ...

  4. Generator(生成器)函数

    一.基础知识 Generator函数是ES6出现的一种异步操作实现方案. 异步即代码分两段,但是不是连续执行,第一段执行完后,去执行其他代码,等条件允许,再执行第二段. 同步即代码连续执行. 1. G ...

  5. 057_统计 Linux 进程相关数量信息

    #!/bin/bashrunning=0sleeping=0stoped=0zombie=0 #在 proc 目录下所有以数字开始的都是当前计算机正在运行的进程的进程 PID#每个 PID 编号的目录 ...

  6. pyexcel_xlsx

    from pyexcel_xlsx import get_data,save_data excel_data = get_data('xxxx.xlsx文件存储位置') #得到的excel_data是 ...

  7. PHP变量及其操作

    一.概念 变量是内存中用于存储数据的一个空间,这个空间有一个名字,这个名字就是变量名,变量名用于对这个内存中的数据进行引用的 二.声明 语法:    $变量名=值 变量名只能包含字母.数字.下划线,只 ...

  8. luogu 1593

    $Answer = A ^ B $ 的因子之和 将 $A$ 进行质因数分解$A = p_1 ^ {a_1} P_2 ^ {a_2} p_3 ^ {a_3} \cdots p_k ^ {a_k}$ $A ...

  9. SONiC项目的发展及其相关介绍(转载)

    SONiC作为一个开源项目,理论上是包含了SAI(switch abstraction interface,交换机抽象接口),SAI是没有开源的,厂商自己完成统一的API,提供给上层sonic用户来调 ...

  10. Kalman实际应用总结

    目录 Kalman理论介绍 一. 简单理论介绍理论 二. 升华理论介绍 Kalman基本应用 一. Kalman跟踪/滤波 二. Kalman预测/融合(单传感器) 三. Kalman多传感器融合A ...