requests处理form-data和payload类型的参数


写在前面

在使用requests发送post请求时,会遇到不同的表单类型,比较常见的是application/x-www-form-unlencoded,直接传递字典即可,有时会遇到multipart/form-data和Request Payload类型,只要做简单的处理即可。

form-data类型

import requests

def get_form_data(data:dict) -> tuple:
    data_files = []
    for key in data.keys():
        if not isinstance(data[key],list):
            data_files.append((key,(None,data[key],'multipart/form-data')))
        else:
            for i in data[key]:
                data_files.append((key,(None,i,'multipart/form-data')))
    return tuple(data_files)

# 如果有多个同名参数则写成列表形式
data = {'a','a','b':'b','c':['1','2','c']}
req = requests.post(url,files = get_form_data(data))

注:requests会帮你处理boundary分隔符,如果服务器需要指定的分隔符,则要做额外的处理。

from urllib3 import encode_multipart_formdata
data = get_form_data(data)
# 在此替换你的分隔符
boundary='----WebKitFormBoundaryKPjN0GYtWEjAni5F'
m = encode_multipart_formdata(data, boundary=boundary)
response = requests.post(url,
                         # 调用encode_multipart_formdata处理后要以data进行提交
                         data=m[0],
                         # 在headers中指定你的分隔符
                         headers={'Content-Type': "multipart/form-data; "+boundary})

Payload类型

此类型的处理比较简单,使用json.dumps处理一下参数字典即可。