当前位置:   article > 正文

python实现Content-Type: multipart/form-data; boundary=xxx接口的调用

content-type: multipart/form-data

在接口测试的过程中,会遇到一些文件上传的接口,一般我们可以读取文件后,将其作为post的一个参数,直接实现文件的上传。例如:

with open('massive-body') as f:
    requests.post('http://some.url/streamed', data=f)
  • 1
  • 2

更多的时候,遇到的是及包含表单数据,也包含需要上传的文件。抓取接口,会看到接口的请求实体中有“Content-Type: multipart/form-data; boundary=xxx”,接口的表单参数样式也比较奇怪。
在这里插入图片描述在这里插入图片描述
临时补充一下Content-Type的知识:

在 HTTP/1.1 协议中,使用 POST 请求提交数据时常用的 Content-Type 有以下几种:

  • application/x-www-form-urlencoded 原生 Form 默认的提交方式,
    最常用的一种,支持GET/POST等方法。主要把数据编码成键值对的方式, 并且把特殊字符转义成 utf-8 字符,如空格会被转义成%20。
  • application/json 由于 JSON 格式所表示的结构化数据远比键值对复杂得多,所以使用 JSON系列化之后的字符串进行数据交换的方式越来越受人们青睐。特别适合 RESTful 类型的接口。 text/xml 使用 XML-RPC(XML Remote Procedure Call) 协议进行数据传输,相比于 JSON 的方式更为臃肿。
  • multipart/form-data 使用 Form 提交小文件, 直接把文件内容放在Body中进行传输的方式。考虑到同时上传多个字段或文件,所以需要按照一定规则随机生成或手动指定一个 boundary用于分割数据,然后按照一定格式、顺序进行排列构成完整的 Body 进行传输。

继续回到抓取的的接口,接口中数据按照请求中的boundary将数据进行分割,同时还可以看到上传文件中的数据内容。
在这里插入图片描述
对应点的接口脚本应该写成下面的样子:

def Uploadfile(session, file_path='ids-10.csv', category='SF', value='SF', update_rule=1, creator_name='admin', creator_mail='admin@vpgame.cn' ):
    """
    通过文件上传,完成用户分群
    :param session: 因为接口需要cookie,所以使用了session对象
    :param file_path: 存放uid的csv文件
    :param category: 标签
    :param value: 标签值
    :param update_rule:更新规则,默认永不更新
    :param creator_name: 创建用户名
    :param creator_mail: 创建用户邮箱
    :return:
    """
    paths = 'api/bigquery/tag'
    url = console_url_api + '/' + paths
    headers.update({'Accept': 'application/json' })

    files = {'file': open(file_path, 'rb')}
    values = {'update_rule': update_rule, 'value': value, 'category': category,"creator_name":creator_name,"creator_mail":creator_mail}

    res = session.post(url, data=values, files=files, headers=headers)

    return res

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

再多说一句。在 requests 中数据编码时,只有 data 参数为 None 时才会判断使用 json 参数,所以 data 和 json 两个参数同时存在时,只会编码 data 的数据;但 datafiles 是可以同时存在的,而且只要有 files 存在,其它键值对数据也会一起使用 multipart/form-data 的编码方式生成 body 数据

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/66608
推荐阅读
相关标签
  

闽ICP备14008679号