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

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

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

更多的时候,遇到的是及包含表单数据,也包含需要上传的文件。抓取接口,会看到接口的请求实体中有“Content-Type: multipart/form-data; boundary=xxx”,接口的表单参数样式也比较奇怪。
python实现Content-Type: multipart/form-data; boundary=xxx接口的调用_第1张图片python实现Content-Type: multipart/form-data; boundary=xxx接口的调用_第2张图片
临时补充一下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将数据进行分割,同时还可以看到上传文件中的数据内容。
python实现Content-Type: multipart/form-data; boundary=xxx接口的调用_第3张图片
对应点的接口脚本应该写成下面的样子:

def Uploadfile(session, file_path='ids-10.csv', category='SF', value='SF', update_rule=1, creator_name='admin', creator_mail='[email protected]' ):
    """
    通过文件上传,完成用户分群
    :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

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

你可能感兴趣的:(测试,common)