1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > python实现Content-Type: multipart/form-data; boundary=xxx接口的调用

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

时间:2023-11-07 09:57:19

相关推荐

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”,接口的表单参数样式也比较奇怪。

临时补充一下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@' ):"""通过文件上传,完成用户分群: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 + '/' + pathsheaders.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 数据

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。