赞
踩
在接口测试的过程中,会遇到一些文件上传的接口,一般我们可以读取文件后,将其作为post的一个参数,直接实现文件的上传。例如:
with open('massive-body') as f:
requests.post('http://some.url/streamed', data=f)
更多的时候,遇到的是及包含表单数据,也包含需要上传的文件。抓取接口,会看到接口的请求实体中有“Content-Type: multipart/form-data; boundary=xxx”,接口的表单参数样式也比较奇怪。
临时补充一下Content-Type的知识:
在 HTTP/1.1 协议中,使用 POST 请求提交数据时常用的 Content-Type 有以下几种:
继续回到抓取的的接口,接口中数据按照请求中的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
再多说一句。在 requests 中数据编码时,只有 data 参数为 None 时才会判断使用 json 参数,所以 data 和 json 两个参数同时存在时,只会编码 data 的数据;但 data 和 files 是可以同时存在的,而且只要有 files 存在,其它键值对数据也会一起使用 multipart/form-data 的编码方式生成 body 数据。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。