# 最近要做form-data類型接口,大多數這種格式用來文件上傳,但是我們公司就是用這種格式傳輸請求數據。
# 百度了一些基本都是files方式的,可是我們需要data=方式的。下面自己來拼接,代碼很簡單。
# multipart/form-data class MultipartFormData(object): """multipart/form-data格式轉化""" @staticmethod def format(data, boundary="----WebKitFormBoundary7MA4YWxkTrZu0gW", headers={}): """ form data :param: data: {"req":{"cno":"18990876","flag":"Y"},"ts":1,"sig":1,"v": 2.0} :param: boundary: "----WebKitFormBoundary7MA4YWxkTrZu0gW" :param: headers: 包含boundary的頭信息;如果boundary與headers同時存在以headers為准 :return: str :rtype: str """ #從headers中提取boundary信息 if "content-type" in headers: fd_val = str(headers["content-type"]) if "boundary" in fd_val: fd_val = fd_val.split(";")[1].strip() boundary = fd_val.split("=")[1].strip() else: raise "multipart/form-data頭信息錯誤,請檢查content-type key是否包含boundary" #form-data格式定式 jion_str = '--{}\r\nContent-Disposition: form-data; name="{}"\r\n\r\n{}\r\n' end_str = "--{}--".format(boundary) args_str = "" if not isinstance(data, dict): raise "multipart/form-data參數錯誤,data參數應為dict類型" for key, value in data.items(): args_str = args_str + jion_str.format(boundary, key, value) args_str = args_str + end_str.format(boundary) args_str = args_str.replace("\'", "\"") return args_str
調用方式:示例:data即我們要傳的接口參數,需要轉化成form-data格式
需要注意的是boundary參數,這個參數要跟header頭中定義的一樣,否則會出問題。否則會出問題,否則會出問題。重要事情說三遍。
headers = { 'content-type': "multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW", 'cache-control': "no-cache", }
data = { "req":{"cno":"1213058673616305"}, "appid":"dp3wY4YtycajNEz23zZpb5Jl", "ts":1, "sig":1, "v": 2.0 }
# mh = MultipartFormData.format(data=data, boundary="----WebKitFormBoundary7MA4YWxkTrZu0gW")
mh = MultipartFormData.format(data=data, headers=headers)
print(mh)
轉化后的data form-data字符串為:

------WebKitFormBoundary7MA4YWxkTrZu0gW Content-Disposition: form-data; name="v" 2.0 ------WebKitFormBoundary7MA4YWxkTrZu0gW Content-Disposition: form-data; name="req" {"cno": "1213058673616305"} ------WebKitFormBoundary7MA4YWxkTrZu0gW Content-Disposition: form-data; name="sig" 1 ------WebKitFormBoundary7MA4YWxkTrZu0gW Content-Disposition: form-data; name="ts" 1 ------WebKitFormBoundary7MA4YWxkTrZu0gW Content-Disposition: form-data; name="appid" dp3wY4YtycajNEz23zZpb5Jl ------WebKitFormBoundary7MA4YWxkTrZu0gW--
python調用時將轉form-data的字符串給data參數即可:
res = requests.request("POST",self.url,data=mh, headers= headers)