问题:
对接接口,发现对方的接口使用form-data进行数据提交,直接使用requests库的data参数对接,会报参数错误:
params = { 'timestamp':timestamp, 'nonce':nonce, 'apikey':APIKEY, 'signature': signature } data = { 'name': name, 'phone': phone, 'idnum': idnum, 'products': [201,] } resp = requests.post(URL, data=data, params=params, verify=False, timeout=10)
错误提示
解决方案
这一块Requests包做的不是很好,做法具体如下:
1.一种是手动组建form-data并加上headers;数,data参数需要自己用boundary来分隔为指定的形式
2.另一种是通过files参数传递form-data,files参数则以元组的形式传入;3.第三方模块,requests-toolbelt
# 方案一:
params = {
'timestamp':timestamp,
'nonce':nonce,
'apikey':APIKEY,
'signature': signature
}
payload = """------WebKitFormBoundary7MA4YWxkTrZu0gW Content-Disposition: form-data;
name="phone" {} ------WebKitFormBoundary7MA4YWxkTrZu0gW Content-Disposition: form-data;
name="idnum" {} ------WebKitFormBoundary7MA4YWxkTrZu0gW Content-Disposition: form-data;
name="name" {} ------WebKitFormBoundary7MA4YWxkTrZu0gW Content-Disposition: form-data;
name="products" {} ------WebKitFormBoundary7MA4YWxkTrZu0gW--""".format(phone, idnum, name, [201,])
headers = {
"content-type": "multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW"
}
resp = requests.post(URL, data=payload, params=params,
verify=False, timeout=10, headers=headers)
# 方案二:以传入files参数
import json
params = {
'timestamp':timestamp,
'nonce':nonce,
'apikey':APIKEY,
'signature': signature
}
data = {
'name':(None, name),
'phone': (None, str(phone)),
'idnum': (None, idnum),
'products': (None, json.dumps([201,]))
}
resp = requests.post(URL, files=data, params=params,
verify=False, timeout=10)
print(resp.status_code)
print(resp.request.url)
print(resp.request.body)
print(resp.text )
结果
方案三:利用第三方模块(requests-toolbelt)
1、安装
pip install requests-toolbelt
这里我们会用到MultipartEncoder方法
MultipartEncoder上传文件用法
import requests from requests_toolbelt import MultipartEncoder encoder = MultipartEncoder({'field': 'value', 'other_field':'other_value'},boundary="--asddddddddddddddddd") r = requests.post('https://httpbin.org/post', data=encoder, headers={'Content-Type': encoder.content_type})
MultipartEncoder填写表格用法
from requests_toolbelt import MultipartEncoder import requests m = MultipartEncoder(fields={'field0': 'value', 'field1': 'value'}) r = requests.post('http://httpbin.org/post', data=m, headers={'Content-Type': m.content_type})