zoukankan      html  css  js  c++  java
  • 使用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实现

    #!/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 )后,可以使用更简洁的方法处理这种情况了:

    withdatafile.png
    不要自己在header写Content-Type!
  • 相关阅读:
    一种开源的分布式消息系统Nats
    资产盘点:除了金钱,一个人还有哪些资产?
    博客首页规则改版公告
    <html>
    欢迎使用CSDN-markdown编辑器
    java 小程序查看器 启动:未初始化小程序 解决方法
    Hadoop2.6.0版本号MapReudce演示样例之WordCount(一)
    深入学习IOZone【转】
    i.MX6UL -- PWM用户空间使用方法【转】
    linux PWM蜂鸣器移植以及驱动程序分析【转】
  • 原文地址:https://www.cnblogs.com/changyou615/p/8776507.html
Copyright © 2011-2022 走看看