这几天调一个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. node 异步回调 —迭代记录

    1.0  开始时node采用了基础的js回调形势 const fs = require('fs'); fs.readFile('./package.json',(err,data) => { i ...

  2. BZOJ 2699: 更新 (DP)

    题目 对于一个数列A[1-N],一种寻找最大值的方法是:依次枚举A[2]到A[N],如果A[i]比当前的A[1]值要大,那么就令A[1]=A[i],最后A[1]为所求最大值.假设所有数都在范围[1, ...

  3. Linux centOS 6 和 centOS 7一些简单的区别

    最明显的是,获取网络端口的命令和IP信息的命令不同了 所以刚安装的centos 7 使用ifconfig查看ip时有可能出现-bash: ifconfig: 未找到命令

  4. Python 装饰器实现单列模式

    # 使用装饰器实现单列模式 def singleton(cls): # 用来存在实例的字典 singleton_instance = {} def wrapper(*args, **kwargs): ...

  5. 第十三章 使用ADO.NET访问数据库

    一,什么是ADO.NET ADO.NET 是一种以面向对象的设计方法构建的数据访问和操作的类库,它建立在.NET平台上,以便于操作各种各样的数据源.这些数据源可以是数据库, 也可以是文本文件 ,EXC ...

  6. ACWing P372 棋盘覆盖 题解

    Analysis 这是一个经典的二分图问题,我们将图进行奇偶染色,注意边界条件的判断.再跑一遍匈牙利算法就行了,跟上一题很像. #include<iostream> #include< ...

  7. 1059 Prime Factors(25 分)

    Given any positive integer N, you are supposed to find all of its prime factors, and write them in t ...

  8. python 字典元素操作

    #字典创建>>> dict2 = { 'abc': 123, 98.6: 37 }>>> dict2[98.6]37>>> dict2[" ...

  9. java设计模式学习-单例模式

    java中单例模式定义:“一个类有且仅有一个实例,并且自行实例化向整个系统提供.”单例模式可以保证一个应用中有且只有一个实例,避免了资源的浪费和多个实例多次调用导致出错. 单例模式有以下特点: 1.单 ...

  10. Vue实战041:获取当前客户端IP地址详解(内网和外网)

    前言 我们经常会有需求,希望能获取的到当前用户的IP地址,而IP又分为公网ip(也称外网)和私网IP(也称内网IP),IP地址是IP协议提供的一种统一的地址格式,每台设备都设定了一个唯一的IP地址”, ...